2011-12-12 16 views
8

Estoy tratando de probar una DLL C++ de subprocesos múltiples. Se supone que esta DLL es segura para subprocesos. Lo tengo envuelto con boost.python, y me gustaría crear múltiples subprocesos de python para ejercitar el DLL a través del wrapper boost.python. De hecho, soy intentando para causar problemas de enhebrado.Verdadero multithreading con boost.python

Lo que no puedo encontrar una buena documentación es si el intérprete de Python admitirá dos de sus hilos (en diferentes núcleos, por ejemplo) llamando simultáneamente a un módulo importado, y si el GIL necesita atender en absoluto dado que No quiero ninguna seguridad adicional por encima de lo que supuestamente debe proporcionar la DLL.

¿Alguien puede describirme o referirme a una descripción de python llamando a módulos DLL de múltiples hilos y cómo se supone que GIL se utilizará en este caso?

+0

Aparentemente tendrá que liberar el GIL por su cuenta, de lo contrario no tendrá más de un hilo ejecutándose a la vez. Ver http://stackoverflow.com/questions/1576737/releasing-python-gil-in-c-code – lvella

+1

¿Es este un duplicado de http://stackoverflow.com/questions/8009613/? –

+0

Una pregunta complementaria: si no lanzo el GIL, y el código de C++ llamado desde Python crea un hilo, puede este hilo llamar al código de python de forma segura o no. Supongo que no, ya que explicaría un accidente que tuve ... – MatthieuW

Respuesta

1

La respuesta es no, el GIL nunca se verdaderamente multi-hilo a menos que el DLL libera manualmente la cerradura. Python permite que se ejecute exactamente un hilo a la vez, a menos que la extensión indique de forma manual: "Estoy bloqueado, continúe sin mí". Esto se hace comúnmente con la macro Py_BEGIN_ALLOW_THREADS (y deshecha con Py_END_ALLOW_THREADS) definida en python's include/ceval.h. Una vez que una extensión hace esto, Python permitirá que se ejecute otro subproceso, y el primer subproceso que haga cualquier cosa de pitón probablemente cause problemas (como indica la pregunta del comentario). Realmente está pensado para bloquear en E/S o entrar en un gran tiempo de cómputo.