次の状況を考慮してください。
変数を常に変更する QThread ( と呼びましょうcounter
) と、定期的に読み取る QTimer がありますcounter
。同時に複数のスレッドによって変更される可能性のある変数を同期する必要があることはわかっていますが、この場合も同期が必要ですか?
次の状況を考慮してください。
変数を常に変更する QThread ( と呼びましょうcounter
) と、定期的に読み取る QTimer がありますcounter
。同時に複数のスレッドによって変更される可能性のある変数を同期する必要があることはわかっていますが、この場合も同期が必要ですか?
あなたが説明したシナリオは安全ではありません。同期が必要です。Qt には、ロックまたはロックフリー メカニズムを介してこれを支援できるクラスがいくつかあります。
QMutex、QReadWriteLock、QSemaphore、QWaitCondition、QFuture、QFutureWatcher、QAtomicInt、QAtomicPointer をのぞいてみてください。さらにstd::atomic<T>
、C++ 11 を使用できます。
はい、常に同期が必要です — データ競合がある場合、プログラムは未定義の動作をするという標準の規定以外の理由がない場合です。
「従来の」方法であると思われるカウンター変数を保護するミューテックスと同期するかstd::atomic<int>
、データ競合を作成せずにアクセスできるカウンターに変数を使用できます。