違い

2016-10-21 1 views
6

は、次のC + 11のコードを検討します出力を得る:違い

A 27186 
B 86970 
C 1001961755 
D 2001585903 

これは期待されています。 ABに到着するまでに最小限の時間がかかり、1秒間待ってからCになり、残りの2秒間を待って(すでに経過した1秒間)Dになります。

のMACコンパイラは次のとおりです。

$ c++ --version 
Apple LLVM version 8.0.0 (clang-800.0.38) 
Target: x86_64-apple-darwin16.0.0 
Thread model: posix 

LinuxはLinuxの

結果、私はc++ -std=c++11 -pthread question.cc -o questionと同じコードをコンパイルして実行し、その結果得た:

A 32423 
B 444340 
C 1003635793 
D 3006121895 

Linuxのコンパイラを:

$ c++ --version 
c++ (Debian 4.9.2-10) 4.9.2 
Copyright (C) 2014 Free Software Foundation, Inc. 

また、LinuxではLLVM C++コンパイラclang++を試しました。同じ結果。

Q

はなぜCとLinux上Dの間で完全に2秒の遅れがありますか?非同期タスクがバックグラウンドで実行されていないのでしょうか?間違ったコンパイルオプションを使用していますか?

+0

gcc 6.2でLinuxで再現できません。 CからDまではさらに1秒かかる。 –

+0

@SamVarshavchikコンパイラの違いは? – rityzmon

+0

Linux 4.4.0-42でg ++ '5.4.0-6ubuntu1〜16.04.2'で再現できます。'strace question 'の出力をLinuxに投稿するのはどうですか? –

答えて

7

asyncは、別のスレッドで開始する場合はオプションのパラメータとして指定します。コードを実行するために.waitが呼び出されるまで待ってください。

あなたはそれを省略して「気にしない」を選択しました。

気になる場合は、別のスレッドに設定してください。そうでない場合は、.waitが実行されるまで待っていた場合、または新しいスレッドを開始してそこに実行するまで待っても驚かないでください。あなたのケースでは、あるコンパイラがそれを怠け者にし、もう一方のコンパイラはそれを自分のスレッドに入れます。どちらも標準によって許可されています。

期待する動作を得るには、std::asyncの最初の引数としてstd::launch::asyncを渡します。それを実行する方法を言われずに

理論 asyncで今

は、スマートな何かを行うことになっています。しかし、コンパイラの中には、「いつも怠けているのは、私たちの仕事が少ない」(あるいは常に非同期的)というものがありました。

これは実装上の問題です。現時点では、作業中のすべてのC++ 11コンパイラでasyncをスマートにすることはできません。 10年後に戻ってきてください。