2013-04-26 13 views
6

C++ 14(別名C++ 1y)に含めることを提案しているのは、新しいスレッド同期プリミティブです。ラッチとバリアです。提案はN3600の `latch`サンプルに競合状態がありますか?

それは良いアイデアのように聞こえるとサンプルは、それは非常にプログラマフレンドリーに見えるようです。残念ながら、私はサンプルコードは未定義の動作を呼び出すと思います。提案は、latch::~latch()について:

ラッチを破棄します。他のスレッドがwait()にあるときにラッチが破棄された場合、またはcount_down()が呼び出されている場合、その動作は未定義です。それは「wait()に」と言うとないことを

count_down()用途の説明として、「wait()にブロックされました」。

は、その後、次のサンプルが提供される:

第2の使用ケースの一例を以下に示します。私たちはデータをロードしてから、いくつかのスレッドを使ってデータを処理する必要があります。データのロードはI/Oバウンドですが、スレッドの開始とデータ構造の作成はCPUバウンドです。これらを並列に実行することで、スループットを向上させることができます。

void DoWork() 
{ 
    latch start_latch(1); 
    vector<thread*> workers; 
    for (int i = 0; i < NTHREADS; ++i) { 
     workers.push_back(new thread([&] { 
     // Initialize data structures. This is CPU bound. 
     ... 
     start_latch.wait(); 
     // perform work 
     ... 
     })); 
    } 
    // Load input data. This is I/O bound. 
    ... 
    // Threads can now start processing 
    start_latch.count_down(); 
} 

それはスコープを離れるときwait()から復帰して戻っスレッド、およびラッチの破壊間の競合状態がありませんか?それ以外に、threadオブジェクトはすべて漏洩しています。 count_downが返る前にスケジューラがすべてのワーカースレッドを実行せず、start_latchオブジェクトがスコープを離れると、未定義の動作が発生すると思います。恐らく、ベクトルとjoin()deleteのすべてのワーカースレッドをcount_downの後に、しかし戻る前に繰り返すように修正することが考えられます。

  1. サンプルコードに問題はありますか?
  2. あなたは、レビューがどのような使用経験がどのようになるかを見るために、タスクが非常に単純であっても完全な正しい例を示すべきであることに同意しますか?

注:ワーカースレッドの1つ以上がまだ待つことを開始していないので、破壊されたラッチをwait()を呼ぶ可能性が表示されます。


更新:現在、新しいバージョンの提案がありますが、代表例は変更されていません。

+0

@stefan:私は、「ブロックされたスレッドのリリースは」「() 'これらのスレッドを実行するのを待つ少なくとも待機'から復帰まで」 –

+0

はさらに、それが可能だ含まれていることはないと思うことの一つスレッドはまだ 'start_latch.wait()'呼び出しに達していません。 –

+0

私はあなたに同意します。例が壊れているようです... – yohjp

答えて

4

ありがとうございます。はい、私は、(その防衛の中で、簡潔にすることを意図していた)サンプルコードが壊れていると思います。おそらくスレッドが終了するのを待つべきです。

wait()でスレッドをブロックできるようにする実装では、何らかの種類の条件変数が発生する可能性がほとんどあり、スレッドがまだwait()を終了していない間にラッチを破棄する可能性はあります。

用紙を更新する時期があるかどうかわかりませんが、次のバージョンが修正されていることを確認できます。

Alasdair

+1

StackOverflowへようこそ。公開していただきありがとうございます。それが利用可能になったときにあなたが次のバージョンへのリンクをフォローアップするなら、本当に素晴らしいでしょう。 –

+0

7月にサンタクララにSG1ミーティングが追加されました - SG1 wikiに更新された論文を掲載しました。シカゴ以前のサンタクララから出てきた他の変更と一緒に出版される予定です郵送。 –