2013-03-03 26 views
2

我試圖創建一個線程,做一個非阻塞的方式工作,並調用者有權選擇是否等待線程與否。加入一個線程從另一個功能

class A { 
public: 
    void run(); 
    void wait(); 
    pthread_t worker; 
}; 

run()函數創建一個線程並立即返回。如果用戶需要等待,他可以撥打wait()。該定義看起來像

void A::Run() { 
    //create worker thread 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 
    FATALIF(pthread_create(&worker, &attr, work, param), "Error creating worker thread."); 
    pthread_attr_destroy(&attr); 
} 

void A::WaitUntilDone() { 
    FATALIF(pthread_join (worker, NULL), "joining threads failed."); 
} 

當我打電話WaitUntilDone(),但是,主叫方不堵的。然後我試圖從WaitUntilDone()移動joinRun(),它的工作原理:

void A::Run() { 
    //create worker thread 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 
    FATALIF(pthread_create(&worker, &attr, work, param), "Error creating worker thread."); 
    FATALIF(pthread_join (worker, NULL), "joining threads failed."); 
    pthread_attr_destroy(&attr); 
} 

void A::WaitUntilDone() { 
    // do not wait here 
    // FATALIF(pthread_join (worker, NULL), "joining threads failed."); 
} 

在我cound找到pthread_join所有示例中,pthread_join通話pthread_create後,立即來了,所以在我看來,我們不能區分這些功能。有什麼解決方法嗎?

+0

您可以使用指示是否等待的靜態變量。無論如何,你必須在run()之前設置這個變量,因爲執行n會立即返回,就像你說的那樣。請確保用戶在運行線程之前設置此變量.. – 2013-03-03 16:12:28

+0

在此api中,用戶必須在'run'後面調用'wait',但似乎可以嘗試定義最後要設置的變量的'work'函數,並使用'while'循環來阻止'wait' .. – Yang 2013-03-03 16:18:05

+4

你能製作一個小的,可編譯的代碼片段來證明這個問題嗎?通常,分開'create'和'join'調用應該不成問題 - 我寫了大量代碼,至少這樣做。另外,pthread_join的返回值是什麼 - 你確定當你調用WaitUntilDone時你的工作線程仍在運行嗎? – sonicwave 2013-03-03 16:32:59

回答

2

你打電話,做pthread_join該功能之前,新創建的線程可能返回。因此,它根本不會阻止,但它工作正常。