| | |
| | | public: |
| | | PyGILThreadLock() |
| | | { |
| | | _save = NULL; |
| | | nStatus = 0; |
| | | nStatus = PyGILState_Check(); //检测当前线程是否拥有GIL |
| | | //PyGILState_STATE gstate; |
| | | if (!nStatus) |
| | | m_acquired = false; |
| | | //检测当前线程是否拥有GIL |
| | | if (!PyGILState_Check()) |
| | | { |
| | | cout << "申请获取GIL" << endl; |
| | | gstate = PyGILState_Ensure(); //如果没有GIL,则申请获取GIL |
| | | nStatus = 1; |
| | | cout << "load GIL" << endl; |
| | | m_gil_state = PyGILState_Ensure(); //如果没有GIL,则申请获取GIL |
| | | m_gil_state = true; |
| | | } |
| | | _save = PyEval_SaveThread(); |
| | | PyEval_RestoreThread(_save); |
| | | } |
| | | ~PyGILThreadLock() |
| | | { |
| | | _save = PyEval_SaveThread(); |
| | | PyEval_RestoreThread(_save); |
| | | if (nStatus) |
| | | if (m_acquired) |
| | | { |
| | | cout << "释放当前线程的GIL" << endl; |
| | | cout << "reload GIL" << endl; |
| | | PyGILState_Release(gstate); //释放当前线程的GIL |
| | | } |
| | | } |
| | | |
| | | private: |
| | | PyGILState_STATE gstate; |
| | | PyThreadState *_save; |
| | | int nStatus; |
| | | PyGILState_STATE m_gil_state; |
| | | bool m_acquired; |
| | | }; |