2012-05-25 83 views
0

我正在嘗試編寫一個Teamcenter ITK(基於c)的程序,該程序將作爲從主線程調用的不同線程運行。主線程從UI上的操作被調用。由於子線程需要花費很多時間才能完成,因此如果我不創建子線程並將代碼放入主線程,UI將凍結最多10分鐘,這是不可接受的。現在,主線程和子線程都需要共享由主線程完成的身份驗證,因爲我使用的是SSO。他們還需要連接到數據庫。最後,主線程不應該等待子線程完成,否則具有子線程的全部目的將被打敗。調用子線程的代碼是Teamcenter中的多線程ITK

handle = (HANDLE) _beginthread (submitToPublishTibcoWf, 0, &input); // create thread 
do 
{ 
    sprintf (message, "Waiting %d time for 1000 milliseconds since threadReady is %d\n", i++, threadReady); 
    log_msg (message); 
    WaitForSingleObject(handle, 1000); 
} 
while (!threadReady); 

sprintf (message, "Wait for thread to be ready over after %d tries since threadReady is %d\n", i, threadReady); 
log_msg (message); 
log_msg ("Main thread about to exit now"); 

我設置threadReady = 1(全局變量)每當我關於在子線程僅需8分鐘,運行時執行的代碼段。

現在的問題是,主線程退出後,子線程表現得更加糟糕。我得到這個錯誤:

週五5月25日11:34:46 2012:主線程即將退出 此應用程序已請求運行時以不尋常的方式終止它。 有關更多信息,請聯繫應用程序的支持團隊。

大多數子線程執行但有時它只是崩潰到最後。

任何幫助,非常感謝。

+0

有時我在調試時出現此錯誤:tcserver.exe中0x580d8390未處理的異常:0xC0000005:訪問衝突讀取位置0xffffffec。 – Yogesh

回答

1

爲了防止退出子線程,我們可以使用detaching使子進程獨立並且不期望從父進程加入。 因此,我們不應該加入子進程,之後,我們必須從主要的thrread中分離出來。 這樣的:

pthread_create(th, attr, what); 
pthread_detach(th); 
// and never join 

另一種可能有用的東西:
1.如果你喜歡一些效率添加到您的應用程序,我建議不要使用觀察像threadReady信號的特殊事件的詳盡傾聽。相反,在pthread中使用條件變量或其他信號方法(如gObject)。
2.你有一些線程之間共享的數據,它可以面對互斥問題,並且在多進程或多線程應用程序中可能會發生其他問題,而是嘗試通過使用某些機制來處理此問題,如互斥鎖或信號量條件變量。 此致敬禮。