一、C++调用Python API多线程安全
参考网页:http://blog.csdn.net/cedricporter/article/details/6810665
Python不支持多线程,如果在c使用多线程就会报错使用GIL可以解决。
主要函数
1.PyGILState_STATE PyGILState_Ensure( )
确 保当前线程已经可以调用与当前 Python 状态无关的 Python C API,或者它的线程锁。当一个线程每次希望匹配到PyGILState_Release()调用时可能会反复调用这个函数。通常,在线程状态恢复为Release()之前的状态时,其它线程相关的API 可能会在一对 PyGILState_Ensure()和PyGILState_Release()之间调用。
2. void PyGILState_Release( PyGILState_STATE)
释放所有之前获取的资源。这个调用之后,Python的状态会与之前PyGILState_Ensure调用一致(但是通常这个状态对调用者是未知的,因此使用GILState API)
每次调用 PyGILState_Ensure() 都要在同一线程对应调用 PyGILState_Release() 。2.3版本新增。
实例
主线程
// 初始化
Py_Initialize();
// 初始化线程支持
PyEval_InitThreads();
// 启动子线程前执行,为了释放PyEval_InitThreads获得的全局锁,否则子线程可能无法获取到全局锁。
PyEval_ReleaseThread(PyThreadState_Get());
// 其他的处理,如启动子线程等
......
// 保证子线程调用都结束后
PyGILState_Ensure();
Py_Finalize();
// 之后不能再调用任何python的API
子线程
state = PyGILState_Ensure( );
PyGILState_Release( state );