問題描述:c程式中需要多次呼叫python腳步;
初始做法:每次呼叫python指令碼時,開始初始化python環境(py_initialize),呼叫完之後結束python環境(py_finalize();)問題:程式偶然會出現崩潰的現象;
c程式多次呼叫python指令碼的正確開啟模式如下:
1. 在主線程中這樣處理
// 初始化
py_initialize();
if ( !py_isinitialized() )
return
// 初始化執行緒支援
pyeval_initthreads();
// 啟動子執行緒前執行,為了釋放pyeval_initthreads獲得的全域性鎖,否則子執行緒可能無法獲取到全域性鎖。
pyeval_releasethread(pythreadstate_get());
// 其他的處理,如啟動子執行緒等
......
// 保證子執行緒呼叫都結束後
pygilstate_ensure();
py_finalize();
// 之後不能再呼叫任何python的api
2. 在主線程,或者子執行緒中,呼叫python本身函式採用如下處理
pygilstate_state state;
state = pygilstate_ensure();
...// 呼叫python的api函式處理
...pygilstate_release(state);
注:
兩個和全域性鎖有關的巨集,py_begin_allow_threads 和 py_end_allow_threads。這兩個巨集是為了在較長時間的c函式呼叫前,臨時釋放全域性鎖,完成後重新獲取全域性鎖,以避免阻塞其他python的執行緒繼續執行。這兩個巨集的用法如下:
pygilstate_state state;
state = pygilstate_ensure();
// 呼叫python的api函式處理
......
py_begin_allow_threads
// 呼叫需要長時間的c函式
......
py_end_allow_threads
// 呼叫python的api函式處理
......
pygilstate_release(state);
防止程式多次執行(呼叫DLL)
region 防止程式多次執行 public abstract class oneinstance return ret dllimport kernel32.dll charset charset.auto private static extern intptr openmutex uint d...
Python呼叫C程式
目錄 python呼叫c程式的意義 呼叫示例 編寫c程式 編譯c程式 呼叫 我們知道,python具有編寫開發快 程式可讀性良好 支援物件導向的特點。種類繁多的python原生庫和第三方框架使python承擔越來越多的任務。但是python自身的缺陷也確實是python開發者要面對的問題 受制於動態...
C 防止標頭檔案多次呼叫
關於 pragma once簡單說明 若涉及多個檔案的編譯執行,如果把所有標頭檔案,原始檔都新增到當前工程下,並且每個標頭檔案都沒有加 pragma once,若在主函式include各個cpp,則會報錯,型別重定義 這樣理解,編譯的時候自動呼叫了一次,如果在主函式中再include一次,則相當於標...