Seite 1 von 1

C-API Threading?!

Verfasst: Donnerstag 4. März 2010, 19:57
von Krauzi
Hi leute ich arbeite gerade an einem eingebundenen python für ein c++ programm. Nur irgendwie will das threading nicht klappen.

Code: Alles auswählen

PyGILState_STATE gstate;
gstate = PyGILState_Ensure();

/* Perform Python actions here.  */
result = CallSomeFunction();
/* evaluate result */

/* Release the thread. No Python API allowed beyond this point. */
PyGILState_Release(gstate);
-> so steht es in der doc, jedoch klappt das auch nicht.
ich habe auch schon mit Py_BEGIN_ALLOW_THREADS etc rumexperimentiert - leider ohne erfolg. Hat jemand schon erfahrung damit und kann mir hier helfen, das ganze zum laufen zu bekommen?
Boost threads wollte ich eigentlich nicht unbedingt einsetzten, weil ich hier probleme mit den PyObjects bekomme (die für die für boost thread benötigten klassen immer increfed, decrefed, etc. werden müssen).

Hoffe mir kann jemand helfen.
MfG Krauzi

Verfasst: Freitag 5. März 2010, 08:37
von CM
Hallo,

ich kann leider keine Lösung anbieten - aber das Thema interessiert mich.

Kannst Du uns sagen was "klappt nicht" näher erklären? Gibt es einen Compilerfehler? Oder hängt das Programm an irgendeiner Stelle?

Gruß,
Christian

Verfasst: Freitag 5. März 2010, 10:24
von philistion
Hast du auch mal den Low-Level-Ansatz versucht?

Code: Alles auswählen

PyThreadState *_save;

_save = PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
//...Do some blocking I/O operation...
PyEval_AcquireLock();
PyThreadState_Swap(_save);
Fängst du Exceptions ab? Wenn ja wie lauten die Fehlermeldungen?

Verfasst: Freitag 5. März 2010, 17:21
von Krauzi
da gibts bei mir nen critical error (ohne fehlermeldung) wenn ich die funktion: PyObject_CallObject aufrufe.

EDIT: Ok, anscheinend gibt's unter windows probleme mit dem threading, weil hier öfters ein deadlock auftritt...

Verfasst: Mittwoch 17. März 2010, 18:08
von Krauzi
Ah sehr gut es gibt eine saubere Methode die durch die C-API bereit gestellt wird:
PyThread_start_new_thread( [void Funktion], [void *Argument] )
dafür muss die headerdatei pythread.h eingebunden werden.

die Funktion "Funktion" (muss vom typ void sein) wird dann mit dem Argument "Argument" aufgerufen (muss vom typ void * sein).
Ich empfehle ein
"PyGILState_STATE s = PyGILState_Ensure();" am anfang der Funktion "Funktion" sowie ein
"PyGILState_Release(s);" am ende der genannten Funktion.
Threading klappt damit unkompliziert ohne umständliches Interpreter locken.
Leider nicht sehr schnell das ganze, man merkt hier das High-Level interface, jedoch reicht es für z.B. Chat-Programme aus.