如何啓動並聯一個新的線程不停頓的主要功能?多任務處理是不是在我的計劃中工作的C++ 11
這裏是我的代碼:
void someFunction { while(1);}
int main(){
thead *th = new thead(&someFunction);
thead.join();
return 0;
}
但程序不停止
附:如何在並行源中運行線程
如何啓動並聯一個新的線程不停頓的主要功能?多任務處理是不是在我的計劃中工作的C++ 11
這裏是我的代碼:
void someFunction { while(1);}
int main(){
thead *th = new thead(&someFunction);
thead.join();
return 0;
}
但程序不停止
附:如何在並行源中運行線程
這一呼籲:
thread.join();
明確地告訴你的程序要等到thread
執行時,返回的功能。你的函數永遠不會返回,所以你的程序永遠不會通過這個函數調用。您可以在創建線程和join()
相應調用之間啓動額外的線程。例如:
#include <thread>
void someFunction() { for(volatile int x = 0; ; x = x){};}
int main()
{
std::thread t1(someFunction);
std::thread t2(someFunction);
std::thread t3(someFunction);
t1.join();
t2.join();
t3.join();
return 0;
}
會產生3個完全沒有任何作用的線程。如果傳遞給線程的函數返回,這就是你想要做的。
如果你想有之前的任務運行和主程序退出,則需要產生新的進程在依賴於平臺的方式,讓自己的執行不會受到你的程序退出停止。
程序無法停止,因爲主線程調用thread.join()
這意味着它將等待線程「線程」完成,但是那個調用的函數永遠不會完成,因爲它會循環到無窮遠。
你thread.join();
正在等待輔助線程退出,但由於二級線程執行一個無限循環,它永遠不會退出。
編輯:我應該補充的是,標準給予足夠的餘地允許線程退出,但它不是必需的。
好的,thx。什麼在並行流中運行線程? – 2012-01-18 18:23:57
創建線程對象('new thread(someFunction);')創建運行您指定的函數的新線程。 – 2012-01-18 18:29:54
你加入到一段時間(1)循環。當(1)結束時,程序將停止,即。決不。
或立即。這是C++ 11,「一個循環......可以由實現終止。」 – 2012-01-18 18:31:29
@DavidSchwartz - 大概是這樣的,連接會導致引用循環,導致編譯器無法優化它? – 2012-01-18 19:21:30
不太可能。沒有理由與其他人有任何關係。如果代碼終止,那要麼是因爲編譯器沒有足夠的智能來優化循環,要麼是足夠聰明的,以便計算非終止。 (如果我正在編寫一個C++ 11編譯器,我不會優化出一個顯然不會終止的循環,因爲這是令人吃驚的行爲,只有在我無法確定循環終止時才使用規則,或者不,但可以告訴它沒有其他影響。) – 2012-01-18 19:50:59
在C++ 11,實現如下permitted to assume that this kind of loop terminates。所以你的代碼可以被優化到什麼都沒有。否則,很多合法和有價值的優化是不可能的,但偶爾會產生令人驚訝的效果。
'加入()'等待線程完成,並阻止您創建的線程後,它已經開始了。但是在退出或終止它之前,你應該在主線程中調用join()。 – PeterT 2012-01-18 18:22:24