W
Wiktor Adamski
I have 2 threads in C code using python 2.5.2. First thread creates
new interpreter (i need several interpreters but those 2 threads use
only one) like that:
PyEval_AcquireLock();
threadState = Py_NewInterpreter();
PyThreadState_Swap(threadState);
// calling python API
PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
Second thread uses interpreter created in first thread:
PyEval_AcquireLock();
PyThreadState_Swap(threadState);
and sometimes PyThreadState_Swap crashes in debug build
(PyGILState_GetThisThreadState() returns garbage). In release build
that code doesn't run and so far no other problem was found.
I call PyEval_InitThreads() at the begining of program and every
PyEval_AcquireLock() has PyEval_ReleaseLock().
Am I allowed to use the same threadState in different threads?
If I am, is there another problem in my code?
Or maybe it's a bug in python - acording to documentation "Python
still supports the creation of additional interpreters (using
Py_NewInterpreter()), but mixing multiple interpreters and the
PyGILState_*() API is unsupported." - I don't use PyGILState_ but it's
used internally in PyThreadState_Swap(). I also don't use
PyEval_RestoreThread() - comment sugests that crashing code is present
because possibility of calling from PyEval_RestoreThread().
new interpreter (i need several interpreters but those 2 threads use
only one) like that:
PyEval_AcquireLock();
threadState = Py_NewInterpreter();
PyThreadState_Swap(threadState);
// calling python API
PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
Second thread uses interpreter created in first thread:
PyEval_AcquireLock();
PyThreadState_Swap(threadState);
and sometimes PyThreadState_Swap crashes in debug build
(PyGILState_GetThisThreadState() returns garbage). In release build
that code doesn't run and so far no other problem was found.
I call PyEval_InitThreads() at the begining of program and every
PyEval_AcquireLock() has PyEval_ReleaseLock().
Am I allowed to use the same threadState in different threads?
If I am, is there another problem in my code?
Or maybe it's a bug in python - acording to documentation "Python
still supports the creation of additional interpreters (using
Py_NewInterpreter()), but mixing multiple interpreters and the
PyGILState_*() API is unsupported." - I don't use PyGILState_ but it's
used internally in PyThreadState_Swap(). I also don't use
PyEval_RestoreThread() - comment sugests that crashing code is present
because possibility of calling from PyEval_RestoreThread().