2011-12-12 15 views
8

Próbuję przetestować wielowątkowe DLL C++. Ta biblioteka DLL ma być wątkowo bezpieczna. Mam go opakowane boost.python i chciałbym utworzyć wiele wątków Pythona do wykonywania DLL za pomocą opakowania boost.python. W rzeczywistości próbuje powodować problemy z gwintowaniem.True wielowątkowość z boost.python

To, czego nie mogę znaleźć, to dobra dokumentacja na temat tego, czy interpreter python będzie obsługiwał dwa z jego wątków (na różnych rdzeniach, powiedzmy) wywołujących jednocześnie importowany moduł i czy GIL potrzebuje opiekowania się w ogóle Nie chcę żadnego dodatkowego bezpieczeństwa powyżej tego, co powinna dostarczyć biblioteka DLL.

Czy ktoś może opisać lub odesłać mnie do opisu python wywołania modułów DLL z wielu wątków i jak GIL jest suppsed do użycia w tym przypadku?

+0

Wygląda na to, że będziesz musiał uwolnić GIL samodzielnie, w przeciwnym razie nie będziesz mieć więcej niż jednego wątku na raz. Zobacz http://stackoverflow.com/questions/1576737/releasing-python-gil-in-c-code – lvella

+1

Czy jest to duplikat http://stackoverflow.com/questions/8009613/? –

+0

Pytanie boczne: jeśli nie zwalniam GIL, a kod C++ wywołany z Pythona tworzy wątek, czy ten wątek może wywołać kod Pythona bezpiecznie, czy nie. Przypuszczam, że nie tak, jak by to wyjaśnił wypadek ... – MatthieuW

Odpowiedz

1

Odpowiedź brzmi nie, GIL nigdy nie będzie naprawdę wielonitkowa chyba DLL ręcznie zwalnia blokadę. Python pozwala na uruchamianie dokładnie jednego wątku naraz, chyba że rozszerzenie ręcznie mówi: "Jestem zablokowany, kontynuuj beze mnie". Zwykle robi się to za pomocą makra Py_BEGIN_ALLOW_THREADS (i cofnięto za pomocą Py_END_ALLOW_THREADS) zdefiniowanego w include/ceval.h Pythona. Gdy rozszerzenie to zrobi, python pozwoli uruchomić inny wątek, a pierwszy wątek robiący dowolny materiał pythona prawdopodobnie spowoduje problemy (jak zauważa komentarz). To naprawdę jest przeznaczone do blokowania wejść/wyjść lub przechodzenia w ciężki czas obliczeń.