2012-04-07 9 views
8

誰かが新しくstd::asyncの経験を持っていますか?私たちは現在、ファイルチャンクを読み込んでこのチャンクを非同期関数に渡すパラレルファイルパーサーを実装しています。std :: async(std :: launch :: async)とGCCの動作がClangの動作と対比して

このようにClang(v3.0)を使用すると、デフォルトのstd::asyncポリシー(実装に依存します)で本当にうまく動作します。 2つのコアマシンでは、実際にうまくいくものを最大4つのスレッドで起動します。

しかし、GCC(v4.7)では、ファイル読み込みスレッドは新しいスレッドを生成しないので、最後のプログラムは完全に逐次的になります。

std::launch::asyncを使用すると、どちらのバージョンもほぼ同じことをしています(その場合はどうすればよいでしょうか)。

GCCのC++ 11スレッディング機能の現在のステータスを知っている人はいますか?あるいは、これは私たちの実装では誤りでしょうか?

ショートコード:

while (readNewChunk()) { 
    Chunk &chunk = fileReader_.getChunk(); //reading the file 
    ChunkLoader *chunkLoader = new ChunkLoader(); 
    auto ftr = std::async(std::launch::async, &ChunkLoader::createDictionaries, chunkLoader); 
    dictCreationFutures_.push_back(std::move(ftr)); 
} 
+0

Boostを使用することをお勧めします。適切なC++ 11のサポートに大きな飛躍はありません。 C++ 11の新しいスレッドモデルでは、GCCやMSVCが使用しているメモリとは異なるメモリレイアウトが必要です。 –

答えて

15

あなたの望むものでない場合でも、動作は仕様の範囲内です。起動ポリシーを指定しない場合は、async|deferredとなります。つまり、実装を決定するのは実装次第です。 GCCは、選択肢があれば常にdeferredを選択します。

+0

これをクリアしていただきありがとうございます。私は、現在の実装はすべて、単純ではなく、よりインテリジェントなものであると思っていました。 – Bouncner

+4

私は同意しないことを願います。これは、標準が言っていることです(強調しています): "このポリシーがポリシー値を' launch :: async | launch :: deferred'のように他のポリシーとともに指定されている場合、実装は呼び出しを延期するか、並行性が効果的に悪用されることがないようになっています」これは、延期された新しいスレッドの起動とは大きく異なります。 –

5

EDIT2:私はもう少し説明します。

std :: asyncは 'future;'を約束します。それは、あなたがそれを望むとき、そこにあるでしょう。今計算されているかもしれません。求めるときに計算されるかもしれません。

私のメモによると、GCCのデフォルトは延期されています(これは、それが求められたら、その約束を果たし、おそらくあらかじめそうではないということを意味します)。このデフォルトの理由は、GCCが適切なC++ 11スレッディングサポートをまだ提供していないためです。それは、他の多くのものの中で、良い内部スレッドスケジューラを持っていません。ハックのビットです。いいえ、ハックの束のように。実際に、GCC上のC++ 11でスレッドコードを書くと、機能を実装するとうまくいくようになります。今はほとんどが正しく動作します。つまり、結果は最終的に得られますよね?

スレッドを起動するように指示すると、現時点では、(現在の内部スレッドスケジューラの方が優れているCLangとは異なり)自分自身で行うことができることを理解するのは愚かです。

EDIT:真剣に? Misinformedダウンmodding!

私の参考資料です。 http://gcc.gnu.org/projects/cxx0x.html。 「メモリモデル」を含む「並行性」の下のほとんどすべてがNOと書かれています。 GCC.GNU.org。彼らはあなたが知っているGCCの権威です。

は少し私のコメントから編集:

私は本当にブーストを使用することをお勧めします。 GCCの準備ができたら、C++ 11の適切なサポートに大きな飛躍はありません。 C++ 11の新しいスレッドモデルでは、GCCやMSVCが使用しているメモリとは異なるメモリレイアウトが必要です。実装されていません。

+3

C++ 11では "メモリレイアウト"の点で何が変更されましたか? –

+0

@NicolBolas http://gcc.gnu.org/projects/cxx0x.html。 「メモリモデル」を含む「並行性」の下のほとんどすべてがNO –

+5

と記載されていますが、「メモリ*レイアウト*」で何が変更されたのか説明していません。レイアウトとは、物事が他のものと相対的になる場所です。メモリ*モデル*は、アクセスされた変数が他のスレッドなどで見えるようになるときの規則を説明しています。 –

1

これは2年後のことですが、GCC vs. CLangに関する@ std'OrgnlDaveのコメントに対応する必要はあると感じていますが、少なくとも現在は2015年1月clangバージョン3.5とGCCバージョン4.9の動作はまったく同じです。非同期起動ポリシーが明示的に提供されている場合にのみ、起動ポリシーが提供されていないときにデフォルトと異なるようにfuture :: getが呼び出されたときに実行され、どちらのコンパイラでもバックグラウンドで関数が実行されます。

関連する問題