2013-12-11 236 views
1

我有一個應用程序有一個主線程產生另一個線程,它爲每個收到的請求產生線程,我得到一個核心轉儲可能是由於死鎖。上的gdb我看到以下內容:產卵線程時死鎖?

__lll_lock_wait_private(); 
_L_lock_4714(); 
start_thread(); 
clone(); 

這是從下面的代碼樣品產生:

do 
{ 
    pthread_t handle; 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
    pthread_create(&handle, 0, run, msg); 
    pthread_detach(handle); 
} while (!stop) 

運行是一個外部功能,而代碼的其餘部分是類方法的一部分。

void* run(void* arg) 
{ 
    Handler handler; 
    Msg* msg = static_cast<Msg*> (arg); 

    handler.handleMsg(msg); 

    return NULL; 
} 

handleMsg方法進行一些處理,然後調用另一個應用程序通系統調用:

... 
system("AnotherApplication param1, param2 &"); 
... 

注意符號。這是有意的,因爲我希望進程異步運行。響應通過另一種類型的通信進入主線程。

此應用程序已經在Linux上運行:

的Linux 2.6.32-358.14.1.el6.x86_64#1 SMP週一6月17日15時54分二十秒EDT 2013 x86_64的x86_64的x86_64的GNU/Linux的

我不會忽略任何信號。

這裏有什麼問題?

+0

這是字面上你的線程啓動循環?儘可能多地旋轉*,儘可能快*直到局部變量變爲真(它可能永遠不變)? – WhozCraig

+1

您是否檢查任何這些調用的返回碼並將它們回覆或記錄在某處? – Duck

回答

0

pthread_detach手冊告訴我們:

試圖脫離明確的行爲已經分離線程的結果。

但是,您創建的線程是從啓動時分離的。

您期待什麼結果?

+1

其實OP不會將他的線程創建爲分離的。他設置了屬性,但他從不將attr傳遞給'pthread_create':'pthread_create(&handle,0,run,msg);' – Duck