1

インターネットでは、パラレルプログラミングでvolatileキーワードを使用することに関する多くの議論があり、時には矛盾する議論があります。フラグを使用してスレッド間で通信する

このトピックのより信頼できる議論の1つは、this article by Arch Robisonのようです。彼が使用している例は、あるスレッドから別のスレッドに値を渡すタスクです。

スレッド1.は、行列積を計算し、スレッド2に与えます。行列は変数Mであり、フラグはvolatileポインタRです。

  1. スレッド1個の乗算行列積Mを計算し、アトミックRまで
  2. M.
  3. にスレッド2つの待機を指すように Rを設定!= NULL、その後、別の行列の積を計算する因子としてMを使用します。

つまり、Mはメッセージであり、Rはレディフラグである。

著者は、Rをvolatileとして宣言すると、スレッド1からスレッド2への変更を伝播することで問題は解決すると主張していますが、Mの値がどうなるかについては保証しません。 RMへの割り当ては並べ替えることができます。したがって、MRの両方をvolatileにするか、pthreadsなどのライブラリで同期メカニズムを使用する必要があります。

私の質問は何をするか、どのように二つのスレッド間で単一のフラグを共有するためにC

1)で、次の - アトミック他のスレッドがための変更とテストが表示されますことを確認し、それに割り当てる方法他のスレッドの変更。この場合、揮発性の使用は正当なものですか?あるいは、いくつかのライブラリは概念的に優れた、あるいはより速い方法を提供できますか?以下のためのヒントどのように右ロビソンの例を実行するには、ので、どのように他の1つのスレッドから行列Mを送るとpthreadで安全に(好ましくは、移植性、それを行うには)

答えて

0

「揮発性」

2)コンパイラはメモリアクセスを最適化しないようにします。つまり、最後の(ローカル)書き込み以降、メモリ内の値が変更されていないと仮定しないでください。このヒントがなければ、コンパイラーは、変数がコピーされるレジスターの値がまだ有効であると仮定することができます。 したがって、行列がレジスタ内に保持される可能性は低いですが、一般に、両方の変数は、受信者に対して揮発性、またはより正確には揮発性である必要があります。

現実のマルチスレッドでは、受信者のビジー状態を避けるために、シグナリングにセマフォなどを使用することになります。

+0

最初のパラグラップの最後の文に応じて、Andy Robinsonは両方の変数が両方とも揮発性でなければならないと言います。揮発性はフラグと行列への代入の順序変更を妨げるためです。しかし、単純化のために並べ替えの問題を残しておいたと思います。 – user7610

+0

行列は、特にスレッド間でやり取りされると予想されるマルチスレッドアプリケーションでは、おそらく動的に割り当てられ、そのポインタを介してアクセスされます。ポインタは通常はレジスタサイズです:( –

+0

送信側が行列やポインタを再利用する場合は、送信側でのみ揮発性が必要ですが、並べ替えは独立したもので、C11では_Atomicを使用できます。 – Matthias

1

x86のようなアーキテクチャでは、ポインタのような適切な整列(およびサイズ変更)された変数は、デフォルトではアトミックに読み書きされますが、CPUでの並べ替えを防ぐためにメモリの読み書きのシリアル化が必要ですパイプライン(明示的メモリフェンスまたはバスロック操作の使用による)と、volatileの使用により、コンパイラが生成するコードの順序を変更しないようにします。

これを行う最も簡単な方法は、CASを使用することです。ほとんどのCAS組み込み関数は、コンパイラおよびCPUメモリバスレベルで完全なメモリバリアを提供します。MSVCの下では、Interlock*関数を使用することができます。BTS、BTR、Inc、Dec、ExchangeおよびAddはすべてフラグとして機能します.GCCの場合、__sync_*ベースのバリアントを使用します。

携帯可能なオプションの場合は、pthread_mutexまたはpthread_condを使用できます。 C11を使用できる場合は、_Atomicというキーワードを調べることもできます。

0

「古典的な」方法は、スレッド1がスレッド2が待機しているプロデューサ - コンシューマキューに動的に割り当てられたマトリックスへのポインタをプッシュすることです。一旦プッシュされると、スレッド1は別のMを割り当てて、望むならそれで作業を開始することができます。

全体的なパフォーマンスが大規模なマトリックスの操作によって支配されている場合、最適化として揮発性フラグなどを使用することは時期尚早かもしれません。