1

デバイスからデータをキャプチャするスレッドがあります。GUIからスレッドを開始/停止します。現在、スレッドは appcontext 内のboolメンバー を定期的にチェックしています。isCapturingEnabledこのメンバーを GUI から切り替えてbool、スレッドを停止します。

これは、ミューテックスを使用する必要がある場合ですか? キャプチャ スレッドとメイン スレッドがbool同時に書き込みと読み取りを試みる可能性があるためです。

4

1 に答える 1

3

問題は、ある種のロックまたはメモリ バリアがないと、(たとえば) gui スレッドがbooltrue に設定される可能性がありますが、コンパイラの最適化または CPU での最適化のためにスレッドが実際にこれを認識しないことです。レベル。

あなたがする必要があるboolのは、現在の状態がメモリからロードされ、すべてのスレッドが変更を認識できるように新しい状態が正しく書き戻されるような方法で に書き込むことです。これを行う1つの方法は、あなたが特定したように、ミューテックスを使用することです。他の方法は、メモリバリアを使用して、メモリの正しいビューにアクセスしていることを確認することです。ほとんどの言語または OS には、通常、アトミックな方法で単語のサイズまでメモリを操作するための何らかの API があります。たとえば、Windows にはInterlockedCompareExchange関数があります。

ただし、95% のケースでは、読み取り/書き込みをミューテックスでラップするだけで、パフォーマンスの観点からは十分であり、マルチスレッドの正確さに関して簡単に推論できます。

于 2015-03-10T14:49:27.590 に答える