多线程Z3?

时间:2014-08-28 06:33:45

标签: z3 z3py

我正在研究一个Python项目,我目前正试图以一些可怕的方式加快速度:我设置了Z3求解器,然后我分叉了这个过程,让Z3执行求解在子进程中,将模型的pickle表示传递给父进程。

这很好用,代表了我尝试做的第一个阶段:父进程现在不再受CPU限制了。下一步是多线程父项,这样我们就可以并行解决多个Z3求解器。

我非常确定在设置阶段我已经将Z3的任何并发访问互斥,并且任何时候只有一个线程应该触摸Z3。但是,尽管如此,我还是在libz3.so中获得了随机段错误。在这一点上,重要的是要注意,它并不总是触及Z3的相同的线程 - 相同的对象(不是解算器本身,而是表达式)可能在不同的时间由不同的线程处理。

我的问题是,是否有可能多线程Z3?这里有一个简短的说明(http://research.microsoft.com/en-us/um/redmond/projects/z3/z3.html)说"从多个线程访问Z3对象是不安全的。",我想这会回答我的问题,但我还是抱着希望意味着表示不应该同时从多个线程访问Z3 。另一个资源(Again: Installing Z3 + Python on Windows)表示,莱昂纳多本人认为" Z3使用线程本地存储",我想,这将沉没整个事业,但a)答案是从2012年开始,所以也许事情已经改变了,b)也许它使用线程本地存储来处理一些不相关的东西?

无论如何,多线程Z3是否可能(来自Python)?我不想将设置阶段推进子进程......

1 个答案:

答案 0 :(得分:4)

Z3确实使用线程本地存储,但据我所知,代码中只剩下一个点(它跟踪每个线程使用的内存量;在memory_manager.cpp中),但是这不应该对你看到的症状负责。

如果每个线程严格只使用它自己的上下文对象(Z3_context,或者在Python类上下文中),那么Z3应该在多线程设置中表现得很好。这意味着通过其中一个Context创建的任何对象都不能以任何方式与任何其他Context相互作用;如果需要,则必须首先将所有对象从一个上下文翻译成另一个上下文,例如,在Python中通过类ASTRef中的translate(...)等函数。

尽管如此,肯定还有一些问题需要解决。当看到随机段错误时,我的第一个目标是垃圾收集器,因为它可能与Z3的引用计数(在其他API中就是这种情况)不能很好地交互。当同时创建许多Context对象时,也会触发一个已知的错误(虽然在我的待办事项列表中......)