Это продолжение до Вызов Python из C ++
При запуске программы я вызываю следующую функцию для инициализации интерпретатора:
void initPython(){
PyEval_InitThreads();
Py_Initialize();
PyEval_ReleaseLock();
}
Каждый поток создает свою собственную структуру данных и получает блокировку с помощью:
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
//call python API, process results
PyGILState_Release(gstate);
Скорее прямо, как только вы поймете GIL, но проблема в том, что я получаю segfault при вызове Py_Finalize ().
void exitPython(){
PyEval_AcquireLock();
Py_Finalize();
}
Ссылка довольно сомнительна в отношении Py_Finalize () (или, может быть, я просто читаю это неправильно), и я не уверен, может ли PyEval_AcquireLock () получить блокировку, если есть активные потоки, и что произойдет, если там являются активными потоками, когда вызывается Py_Finalize ().
В любом случае, я получаю сегфо, даже если я уверен, что все потоки закончили свою работу, но только если был создан хотя бы один. Например. вызов initPython (), сопровождаемый exitPython (), не создает ошибки.
Я мог бы просто игнорировать проблему и надеяться, что ОС знает, что она делает, но я бы предпочел, чтобы я мог выяснить, что происходит ..