我使用的內核版本2.6.10和「普通」 C.系統+ usleep +多線程= SEGV/SIGILL
我已經縮減的兩個線程,爲什麼我們的程序崩潰。
計時器線程
void TimerThread(void)
{
while (exec) {
usleep(10000);
RSLTCD r = SUCCESS;
// r = LockMutex(Mtx);
do {
// some process
} while(1);
// r = UnlockMutex(Mtx);
}
return ; // Not Reached
}
系統線程
void SystemThread(void)
{
CreateThread(TimerThread, OALTHRD_DEFAULT_STACKSIZE, THREADPRI_NORMAL, 0, 0);
for(;;){
system("echo this is a SYSTEM CALL 1");
system("echo this is a SYSTEM CALL 2");
}
}
我刪除代碼的所有的休息,即使只有運行這個兩個「簡單」的主題, 程序會在幾圈(50-100)之後崩潰。 我也讀過system()使用fork(),有時fork()ing和mutex有問題。 所以我刪除了互斥部分,仍然崩潰。我嘗試使用fork()+ execv()組合和posix_spawn()來創建自己的「系統調用」函數。 這兩種情況都導致了相同的結果。
另外,我還使用其他睡眠功能比usleep試過。(nano_sleep等) 仍然是計劃崩潰
有在多線程程序使用系統()和usleep()函式的麻煩?除了使用這些功能外,還有什麼其他的選擇?
你可以從它崩潰的時間回溯(並將其添加到問題)嗎? – 2013-03-04 09:54:48
我試過在信號處理程序上獲得回溯(),但沒有任何結果。我試圖搞亂編譯器的配置,但它似乎沒有產生任何符號。 – 2013-03-04 10:10:26
沒有說明usleep是如何工作的,不管它是否使用信號,或者是否與其他系統調用交互。所以,長話短說,就是不要使用它。有'nanosleep'這被設計爲沒有任何這樣的問題。我的猜測是,每隔一段時間,你的信號在'fork'後進入錯誤的過程。這是假設你的互斥函數(沒有顯示)當然不會被破壞。 – Damon 2013-03-04 11:28:42