Ich versuche eine multi-threaded C ++ DLL zu testen. Diese DLL soll Thread-sicher sein. Ich habe es mit boost.python eingewickelt, und ich möchte mehrere Python-Threads erstellen, um die DLL durch den boost.python-Wrapper auszuüben. Ich versuche tatsächlich , Threading-Probleme zu verursachen.
Was ich keine gute Dokumentation finden kann, ist, ob der Python-Interpreter zwei seiner Threads unterstützt (zum Beispiel auf verschiedenen Kernen), die gleichzeitig ein importiertes Modul aufrufen, und ob die GIL überhaupt etwas zu tun braucht, wenn ich I Ich will keine zusätzliche Sicherheit über das, was die DLL liefern soll.
Kann mir jemand eine Beschreibung von python beschreiben oder verweisen, die DLL-Module von mehreren Threads aufruft und wie die GIL in diesem Fall verwendet wird?
Die Antwort ist nein, die GIL wird nie wirklich Multi-Thread, wenn die DLL die Sperre manuell freigibt. Python lässt genau einen Thread gleichzeitig laufen, es sei denn, die Erweiterung sagt manuell: "Ich bin blockiert, mach weiter ohne mich." Dies wird normalerweise mit dem Makro Py_BEGIN_ALLOW_THREADS gemacht (und rückgängig gemacht mit Py_END_ALLOW_THREADS), das in python's include / ceval.h definiert ist. Sobald eine Erweiterung dies tut, lässt Python einen anderen Thread laufen, und der erste Thread, der Python-Kram macht, wird wahrscheinlich Probleme verursachen (wie die Kommentarfrage feststellt.) Es ist wirklich zum Blockieren von I / O oder zu starker Rechenzeit gedacht.
Tags und Links python multithreading boost-python