Ich arbeite an einem Python-Projekt, bei dem ich derzeit versuche, die Dinge auf schreckliche Weise zu beschleunigen: Ich habe meine Z3-Solver eingerichtet, dann verzweige ich den Prozess und lasse Z3 die Lösung im Kind-Prozess ausführen übergeben Sie eine Pickle-fähige Darstellung des Modells zurück zum Eltern.Mehrfachgewinde Z3?
Das funktioniert gut und stellt die erste Stufe von dem, was ich versuche, dar: der Elternprozess ist jetzt nicht mehr CPU-gebunden. Der nächste Schritt besteht darin, den übergeordneten Thread zu multi-threading-fähig zu machen, sodass wir mehrere Z3-Solver parallel lösen können.
Ich bin mir ziemlich sicher, dass ich alle gleichzeitigen Zugriffe von Z3 in der Setup-Phase mutexed habe, und nur ein Thread sollte Z3 zu jeder Zeit berühren. Trotzdem bekomme ich in libz3.so zufällige segfaults. Es ist wichtig an dieser Stelle darauf hinzuweisen, dass es nicht immer der selbe Thread ist, der Z3 berührt - das gleiche Objekt (nicht die Solver selbst, sondern die Ausdrücke) könnte von verschiedenen Threads zu unterschiedlichen Zeiten bearbeitet werden.
Meine Frage ist, ist es möglich, Z3 Multi-Thread? Es gibt eine kurze Notiz hier (http://research.microsoft.com/en-us/um/redmond/projects/z3/z3.html), die sagt: "Es ist nicht sicher, auf Z3-Objekte aus mehreren Threads zuzugreifen.", Was ich meine Frage beantworten würde, aber ich hoffe, dass es bedeutet zu sagen, dass man sollte Zugriff auf Z3 von mehreren Threads gleichzeitig. Eine andere Ressource (Again: Installing Z3 + Python on Windows) sagt, von Leonardo selbst, dass "Z3 lokalen lokalen Speicher verwendet", was, denke ich, dieses ganze Unternehmen versenken würde, aber a) diese Antwort ist von 2012, also haben sich vielleicht die Dinge geändert und b) vielleicht es verwendet thread-lokalen Speicher für einige nicht verwandte Sachen?
Wie auch immer, ist Multithreading Z3 möglich (aus Python)? Ich würde es hassen, die Setup-Phase in die Child-Prozesse schieben zu müssen ...
Ah, das macht Sinn. Danke für Ihre Hilfe! Ich habe Kontexte über Threads verloren. – Zardus
Es ist ein übliches Muster, um Objekte in einem einzelnen Thread gleichzeitig zu bearbeiten, aber um sie zwischen Threads zu teilen. Dies macht die lokale Speicherung von Threads sehr gefährlich. Beispiel: Haben Sie einen gemeinsamen Kontext und rufen Sie Z3 nur in einer gesperrten Region auf. – usr
@Christoph Wintersteiger: "Es gibt auch einen bekannten Fehler, der ausgelöst wird, wenn viele Context-Objekte gleichzeitig erstellt werden (auf meiner ToDo-Liste ...)" - Ist das gelöst? Ich versuche, die Erstellung von z3-Objekten in meinem Programm zu multithread, aber immer wenn ich die Parallelisierung auf zu viele Formeln zu der Zeit ausführen, erhalte ich eine WindowsError-Ausnahme über Zugriffsverletzung, die für mich nicht viel Sinn macht, aber verwandt sein könnte Erklärung. –