2016-07-13 10 views
0

私はLinux上でg ++コンパイラを使用しています(仮想ボックスのubuntu)。私は、作成後にstd :: threadsに正しく参加するよう呼びかけています。 doは一度に始まるように見えますが、次々と終了します。合計実行時間は、シングルスレッド時間のn倍です。私はpthreadsでこの問題が表示されません。 Pthreadsは完全にスケールされ、実行時間はシングルスレッド時間の(1/n)倍です。linux/macで並列実行していないC++スレッド

Mac OS上でclang ++コンパイラと同じ動作を観察しました。

std :: threadは、 'join'が呼び出されたときにのみ実行できますか?私はstd :: threadコンストラクタでパラメタを渡す必要がありますか?パラレルで実行するように強制しますか? C++ 11のドキュメントを検索し、明らかな理由が見つからなかった。

何か助けていただければ幸いです。

+1

[MCVE](http://stackoverflow.com/help/mcve)? –

+0

標準では、 'std :: thread 'の別々のインスタンスを並列に実行する必要はなく、パラレルで実行する_possibility_を提供するだけです。メインスレッドで寝てみて、何が起こるかを見てください。 – Tim

+0

いつ 'join()'を呼びますか? 「作成後」と呼んだ場合、呼び出しスレッドは新しく作成されたスレッド完了を待つように強制します。 –

答えて

0

質問は少し不明です。しかし、あなたの質問に答える。はい、スレッドと呼ばれるときにスレッドが実行される可能性があります。しかし、それは非常にありそうもありません。

join()の関数は、スレッドの実行が完了したときに戻ります。関数A()が別のスレッドで関数B()を起動し、関数A()のスレッドに参加すると、B()の実行が終了するまで結合点でA()の実行が停止します。 http://www.cplusplus.com/reference/thread/thread/join/

スレッドの実行が完了したときに関数が返すによれば

。 これは、この関数がスレッド内のすべての操作を完了した瞬間を同期させます。これは、この関数を呼び出すスレッドの実行をブロックします。

もう1つの方法は、プロセスを切り離し、結果がより速くなっているかどうかを確認することです。これにより、問題を特定するのに役立ちます。つまり、join()が問題を引き起こしている場合に役立ちます。

関連する問題