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()
移動join
到Run()
,它的工作原理:
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
後,立即來了,所以在我看來,我們不能區分這些功能。有什麼解決方法嗎?
您可以使用指示是否等待的靜態變量。無論如何,你必須在run()之前設置這個變量,因爲執行n會立即返回,就像你說的那樣。請確保用戶在運行線程之前設置此變量.. – 2013-03-03 16:12:28
在此api中,用戶必須在'run'後面調用'wait',但似乎可以嘗試定義最後要設置的變量的'work'函數,並使用'while'循環來阻止'wait' .. – Yang 2013-03-03 16:18:05
你能製作一個小的,可編譯的代碼片段來證明這個問題嗎?通常,分開'create'和'join'調用應該不成問題 - 我寫了大量代碼,至少這樣做。另外,pthread_join的返回值是什麼 - 你確定當你調用WaitUntilDone時你的工作線程仍在運行嗎? – sonicwave 2013-03-03 16:32:59