インターネットでは、パラレルプログラミングでvolatile
キーワードを使用することに関する多くの議論があり、時には矛盾する議論があります。フラグを使用してスレッド間で通信する
このトピックのより信頼できる議論の1つは、this article by Arch Robisonのようです。彼が使用している例は、あるスレッドから別のスレッドに値を渡すタスクです。
スレッド1.は、行列積を計算し、スレッド2に与えます。行列は変数M
であり、フラグはvolatile
ポインタR
です。
- スレッド1個の乗算行列積Mを計算し、アトミックRまで
- M.
にスレッド2つの待機を指すように Rを設定!= NULL、その後、別の行列の積を計算する因子としてMを使用します。つまり、Mはメッセージであり、Rはレディフラグである。
著者は、Rをvolatileとして宣言すると、スレッド1からスレッド2への変更を伝播することで問題は解決すると主張していますが、Mの値がどうなるかについては保証しません。 R
とM
への割り当ては並べ替えることができます。したがって、M
とR
の両方をvolatileにするか、pthreadsなどのライブラリで同期メカニズムを使用する必要があります。
私の質問は何をするか、どのように二つのスレッド間で単一のフラグを共有するためにC
1)で、次の - アトミック他のスレッドがための変更とテストが表示されますことを確認し、それに割り当てる方法他のスレッドの変更。この場合、揮発性の使用は正当なものですか?あるいは、いくつかのライブラリは概念的に優れた、あるいはより速い方法を提供できますか?以下のためのヒントどのように右ロビソンの例を実行するには、ので、どのように他の1つのスレッドから行列Mを送るとpthreadで安全に(好ましくは、移植性、それを行うには)
最初のパラグラップの最後の文に応じて、Andy Robinsonは両方の変数が両方とも揮発性でなければならないと言います。揮発性はフラグと行列への代入の順序変更を妨げるためです。しかし、単純化のために並べ替えの問題を残しておいたと思います。 – user7610
行列は、特にスレッド間でやり取りされると予想されるマルチスレッドアプリケーションでは、おそらく動的に割り当てられ、そのポインタを介してアクセスされます。ポインタは通常はレジスタサイズです:( –
送信側が行列やポインタを再利用する場合は、送信側でのみ揮発性が必要ですが、並べ替えは独立したもので、C11では_Atomicを使用できます。 – Matthias