マルチスレッドC ++アプリでは、単純なブール値を保護するためにmutexが必要ですか?

StackOverflow https://stackoverflow.com/questions/222916

質問

OpenSceneGraphライブラリを使用して3Dレンダリングを行うマルチスレッドC ++アプリがあります。 boost :: threadsを使用して、OSGのレンダリングループを別のスレッドとして開始し、共有状態を含むデータ構造をスレッドに渡すことを計画しています。レンダーループは非常にタイトにする必要があり、OSG自体はロックすることを避けようとするため、同期のために重すぎるもの(ミューテックスなど)を避けようとしています。共有状態のほとんどは、スレッドが開始される前に設定され、変更されることはありません。変更する必要のあるデータがいくつかありますが、これをダブルバッファリングする予定です。ただし、スレッドにレンダリングを一時停止し、後でレンダリングを再開するためのスレッドと、それを強制終了するための別のブール値があります。どちらの場合も、アプリスレッドはブール値を設定し、レンダースレッドはそれを読み取るだけです。これらのブールへのアクセスを同期する必要がありますか?私が知る限り、起こりうる最悪の事態は、一時停止または終了する前にレンダリングループが余分なフレームを継続することです。

他のヒント

ここでは完全なミューテックスを必要とは思いませんが、サポートする同期オブジェクトを使用していない場合、レンダリングスレッドは「中断」状態でビジー待機する必要があります待機プリミティブ。

ただし、さまざまなインターロックされた交換プリミティブの使用を検討する必要があります(WindowsでのInterlockedExchange)。 boolからの読み取り/書き込みは非アトミックではないためではなく、奇妙な動作が発生しないようにするために、コンパイラは単一のスレッドでメモリアクセスを並べ替えます。

このスレッドには、特に単純なデータ型の場合のスレッドセーフに関する詳細情報と説明があります。

スレッドを作成するにはどうすればよいですか- Windowsでの安全なシングルトンパターン?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top