2013-03-04 44 views
2

我使用的內核版本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()函式的麻煩?除了使用這些功能外,還有什麼其他的選擇?

+1

你可以從它崩潰的時間回溯(並將其添加到問題)嗎? – 2013-03-04 09:54:48

+0

我試過在信號處理程序上獲得回溯(),但沒有任何結果。我試圖搞亂編譯器的配置,但它似乎沒有產生任何符號。 – 2013-03-04 10:10:26

+3

沒有說明usleep是如何工作的,不管它是否使用信號,或者是否與其他系統調用交互。所以,長話短說,就是不要使用它。有'nanosleep'這被設計爲沒有任何這樣的問題。我的猜測是,每隔一段時間,你的信號在'fork'後進入錯誤的過程。這是假設你的互斥函數(沒有顯示)當然不會被破壞。 – Damon 2013-03-04 11:28:42

回答

1

基本上,混合多線程和「fork()」並不容易,並且需要更多關於SW的更多細節來提供有用的幫助。請參閱http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them以瞭解混合線程和fork()時的問題的描述。

+0

我已經閱讀過很多次這個鏈接。這就是我發現互斥鎖和fork()的地方。但是,正如你所看到的那樣,即使刪除這些互斥體並僅保留ulseep()。它仍然崩潰。我甚至刪除了do-while塊中的所有內容。 – 2013-03-04 10:13:39

+0

什麼是其他線程在做什麼,他們是否調用任何libc函數? 「系統」至少會混淆信號並使用「等待」。你可以嘗試用「fork/exec/wait」替換「system」嗎?將採取更多代碼,但會減少可能的故障點數量。 – user2116939 2013-03-04 11:29:48

+0

我發佈的代碼就是它的全部。我現在才運行和調試只有這兩個主題,使用系統線程的「主線」。我已經刪除了所有其他代碼以查明它出錯的位置。我也嘗試過fork/exec/wait,導致了相同的錯誤。 – 2013-03-04 11:35:37