-5

2 つの C++ クラスobjecManipupdater. このupdaterクラスには、アプリケーションのロボット アームの状態をチェックするタイマーがあります。

移動している場合は何もしません。それ以外の場合は、アクション キューから getNextAction() を実行します。

アクション キューには class が入力されobjectManipます。current_statusで必要なロボット アームのグローバル変数:がありobjectManipます。

問題は、アクション キューへの入力current_statusが動的ではなく常に行われることです。

4

1 に答える 1

1

質問は非常に不明確なので、これは実際には暗闇の中での刺し傷ですが、アトミックデータ型を使用する必要があります。C ++ 11では、次のようになりますstd::atomicここまたはここを参照してください。以前のバージョンのC ++では、アトミックデータ型を提供するライブラリまたはコンパイラ固有のデータ型を使用する必要があると思います。

CPUとオペレーティングシステムでマルチスレッドがどのように機能するかについていくつかの仮定を立てると、共有変数を宣言し、それを使用するときに一時変数に値を読み取るだけで済む場合があります。volatilevolatileこれは、ハードウェアにマップされた値を読み取る場合など、値を毎回メモリから読み取る必要があるため、多くの最適化が不可能な場合を対象としています。値を変更するスレッドが更新の途中で中断され、別の読み取りが無効で部分的に更新された値を読み取る可能性があるため、それ自体がアトミック更新を保証するものではありません。ブール値の場合、これはかなり安全なはずです。メモリワードの境界を越えず、ワードサイズ以下の整数の場合、これは多くのCPUで安全である可能性があり、単一のメモリワードの書き込み中にスレッドを中断することはありません。それ以外の場合は、データの破損が発生するのを待っています。一部の(今日では珍しい)CPUも、複数のCPUコア間でキャッシュを同期しません。その場合volatile、スレッドが異なれば、キャッシュされた値も異なる可能性があります。結論:使用volatile最後の手段としてハック!

于 2013-03-10T07:50:56.923 に答える