2012-01-18 8 views
1

main関数を一時停止せずに新しいスレッドを並列に開始するにはどうすればよいですか?ここでマルチタスクがC++ 11の私のプログラムで動作していません

は私のコードです:

void someFunction { while(1);} 

int main(){ 

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

} 

しかし、プログラムが


P.S.を停止していませんスレッドを並列ソースで実行する方法

+0

'join()'はスレッドが終了するのを待っていて、スレッドを作成した後に既にブロックしているのをブロックしています。しかし、終了または終了する前にメインスレッドでjoin()を呼び出す必要があります。 – PeterT

答えて

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

Ok、thx。パラレルストリームのスレッドを実行するのは何ですか? –

+0

スレッドオブジェクト( 'new thread(someFunction);')を作成すると、指定した関数を実行する新しい実行スレッドが作成されます。 –

1

while(1)ループに参加しました。 while(1)が終了すると、プログラムは停止します。決してない。

+0

またはすぐに。これはC++ 11です。「ループは実装によって終了すると見なされるかもしれません。」 –

+0

@DavidSchwartz - おそらくは、コンパイラーが最適化を行えないようにするためのループへの参照がジョインになるでしょうか? –

+0

おそらくありません。他の人とは関係がない理由はありません。コードが終了すると、コンパイラーがループを最適化するほどスマートではなかったか、または非終了を意図しているほどスマートだったためです。 (もし私がC++ 11コンパイラを書いていたのであれば、驚くべき振る舞いのために終了しないように意図されたループを最適化しないでしょう。他に何の効果もないとは言えませんでした。) –

4

C++ 11では、実装はpermitted to assume that this kind of loop terminatesです。だからあなたのコードは何にも最適化することができません。さもなければ、多くの正当で有益な最適化は不可能ですが、その影響は時折驚くかもしれません。

関連する問題