Ожидается ли, что PyThreadState * основного потока python будет нулевым?

#python #c #multithreading #gil

#python #c #многопоточность #gil

Вопрос:

У меня есть программа на python, которая обращается к библиотеке c , которая хочет снять все блокировки python, чтобы могли выполняться другие потоки python.

Используя PyEval_SaveThread и PyEval_ReleaseThread , я получаю ошибки о том, что состояние потока равно НУЛЮ:

 Fatal Python error: PyEval_SaveThread: NULL tstate
  

Однако функция более низкого уровня, похоже, с радостью принимает нулевое состояние:

 PyThreadState *s;
s = PyThreadState_Swap(NULL);
// (now s = 0)
PyEval_ReleaseLock();

// ....

PyEval_AcquireLock();
PyThreadState_Swap(s);

// everything seems to be just fine :)
  

Ответ №1:

Ответ: нет, это никогда не должно быть NULL (если это так, то это фатальная ошибка). Оказалось, это было потому, что я связывался с двумя разными версиями python, одной через boost_python, а другой напрямую.

Главный совет: используйте ldd or otool -L для проверки зависимостей вашей библиотеки, когда происходят забавные вещи 😉