2014-01-23 101 views
0

我有加載到第三方程序的代碼,但沒有源代碼。該程序偶爾會掛起,在調試反彙編之後,我將其追蹤爲由於主線程中兩個互斥鎖的鎖定順序與託管我的插件的線程之間的競爭狀態。鎖定互斥鎖的調用都在OSX框架中。從輔助線程獲取主線程

我想看看暫停主線程,而我的插件線程繼續,將允許程序不會導致死鎖。

我可以得到task_info和task_threads一個呼叫線程的名單,但是這需要調用task_for_pid,如果程序以root身份運行,或procmod組的成員,它纔會起作用。這不是一個選項。

那麼,是否有可能獲得主線程(作爲thread_t)並暫掛它從輔助線程,而不需要主應用程序以root身份運行?

+1

這聽起來像是做錯事情的錯誤方式。您是否完全確定死鎖是由操作系統的兩個鎖造成的,並且您在中間沒有自己的代碼的棧幀來控制鎖定順序? –

+0

@AdamRosenfield,完全確定。兩個線程都需要兩個鎖,但是以相反的順序獲取它們。由於競賽條件,偶爾會導致鎖定。 – TheDarkKnight

回答

1

我深深懷疑你要求是怎麼回事,也爲你周圍的工作計劃,但...

您可以使用條件鎖來協調。鎖在條件1中開始。向主線程異步提交一個任務,讓它在條件1時鎖定鎖,然後在條件2中解鎖。然後嘗試將其鎖定在條件3中,這會導致它被阻塞。你的後臺線程可以鎖定條件2中的鎖,所以它會等待主線程被阻塞。它完成它的工作,然後解鎖條件3中的鎖。

NSConditionLock* lock = [[NSConditionLock alloc] initWithCondition:1]; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [lock lockWhenCondition:1]; 
    [lock unlockWithCondition:2]; 
    [lock lockWhenCondition:3]; 
}); 
[lock lockWhenCondition:2]; 
// ... do work ... 
[lock unlockWithCondition:3]; 
+0

感謝您的回答。我目前正在研究一個小型,可重複的項目來演示這個問題,當它完成時我將提供這個問題。您提供的代碼看起來像是一個很好的解決方案,但它意味着將我的項目轉換爲使用Objective-C;目前該插件只是C. – TheDarkKnight

+0

您可以改用pthreads條件和互斥鎖,儘管它不會那麼簡單。或者可能是一對調度信號量。 –