2011-12-12 17 views
8

Sto provando a testare una DLL C + multi-thread. Questa DLL dovrebbe essere thread-safe. Lo ho avvolto con boost.python, e mi piacerebbe creare più thread python per esercitare la DLL attraverso il wrapper boost.python. Sono in realtà provare per causare problemi di threading.True multithreading con boost.python

Quello che non riesco a trovare una buona documentazione su è se l'interprete python supporterà due dei suoi thread (su core diversi, ad esempio) chiamando in un modulo importato contemporaneamente, e se il GIL ha bisogno di tendersi affatto dato che Non voglio alcuna sicurezza aggiuntiva rispetto a ciò che la DLL dovrebbe fornire.

Qualcuno può descrivermi o farmi riferimento a una descrizione di Python che chiama i moduli DLL da più thread e come si suppone che GIL sia usato in questo caso?

+0

Apparentemente dovrai rilasciare GIL da solo, altrimenti non avrai più di un thread in esecuzione alla volta. Vedi http://stackoverflow.com/questions/1576737/releasing-python-gil-in-c-code – lvella

+1

Si tratta di un duplicato di http://stackoverflow.com/questions/8009613/? –

+0

Una domanda a parte: se non rilascio GIL e il codice C++ chiamato da Python crea un thread, questo thread può chiamare il codice Python in sicurezza o meno. Suppongo che non come spiegherebbe un incidente che ho avuto ... – MatthieuW

risposta

1

La risposta è no, la GIL non sarà mai veramente multi-thread a meno che la DLL rilascia manualmente il blocco. Python consente di eseguire esattamente un thread alla volta, a meno che l'estensione non dica manualmente "Sono bloccato, continua senza di me". Questo è comunemente fatto con la macro Py_BEGIN_ALLOW_THREADS (e annullata con Py_END_ALLOW_THREADS) definita in include/ceval.h di python. Una volta che un'estensione lo fa, python consentirà l'esecuzione di un altro thread, e il primo thread che esegue qualsiasi roba di Python probabilmente causerà problemi (come le note delle domande dei commenti). È pensato per bloccare l'I/O o passare molto tempo di elaborazione.