c和c++调用Python 多线程安全

一、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 );

你可能感兴趣的:(语言)