2012-01-18 43 views
1

如何啓動並聯一個新的線程不停頓的主要功能?多任務處理是不是在我的計劃中工作的C++ 11

這裏是我的代碼:

void someFunction { while(1);} 

int main(){ 

thead *th = new thead(&someFunction); 
thead.join(); 
return 0; 

} 

但程序不停止


附:如何在並行源中運行線程

+0

'加入()'等待線程完成,並阻止您創建的線程後,它已經開始了。但是在退出或終止它之前,你應該在主線程中調用join()。 – PeterT 2012-01-18 18:22:24

回答

1

這一呼籲:

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個完全沒有任何作用的線程。如果傳遞給線程的函數返回,這就是你想要做的。

如果你想有之前的任務運行和主程序退出,則需要產生新的進程在依賴於平臺的方式,讓自己的執行不會受到你的程序退出停止。

3

程序無法停止,因爲主線程調用thread.join()這意味着它將等待線程「線程」完成,但是那個調用的函數永遠不會完成,因爲它會循環到無窮遠。

2

thread.join();正在等待輔助線程退出,但由於二級線程執行一個無限循環,它永遠不會退出。

編輯:我應該補充的是,標準給予足夠的餘地允許線程退出,但它不是必需的。

+0

好的,thx。什麼在並行流中運行線程? – 2012-01-18 18:23:57

+0

創建線程對象('new thread(someFunction);')創建運行您指定的函數的新線程。 – 2012-01-18 18:29:54

1

你加入到一段時間(1)循環。當(1)結束時,程序將停止,即。決不。

+0

或立即。這是C++ 11,「一個循環......可以由實現終止。」 – 2012-01-18 18:31:29

+0

@DavidSchwartz - 大概是這樣的,連接會導致引用循環,導致編譯器無法優化它? – 2012-01-18 19:21:30

+0

不太可能。沒有理由與其他人有任何關係。如果代碼終止,那要麼是因爲編譯器沒有足夠的智能來優化循環,要麼是足夠聰明的,以便計算非終止。 (如果我正在編寫一個C++ 11編譯器,我不會優化出一個顯然不會終止的循環,因爲這是令人吃驚的行爲,只有在我無法確定循環終止時才使用規則,或者不,但可以告訴它沒有其他影響。) – 2012-01-18 19:50:59