私はC++ std::atomic_flag
をアトミックブールフラグとして使用しています。フラグをtrueまたはfalseに設定することは問題ではありませんが、フラグを現在の値に設定せずに現在の状態を照会する方法はありますか?メソッド「atomic_flag_clear
」と「atomic_flag_set
」があることを知っています。以前の状態を戻しますが、現在の状態も変更します。フラグの状態を変更せずにクエリの状態を調べる方法はありますか?完全な本格的な 'std::atomic<bool>
'を使用する必要がありますか?C++ atomic_flagクエリ状態
答えて
std::atomic_flag
の値をtrue
に設定せずに読み取ることはできません。これは設計によるものです。ブール変数ではありません(そのためにはstd::atomic<bool>
ですが)、C++ 11をサポートするすべてのアーキテクチャーでロックフリーを保証する最小限のフラグです。
一部のプラットフォームでは、唯一の基本命令は交換命令です。そのようなプラットフォームではstd::atomic_flag::test_and_set()
はexchange var,1
とclear()
とexchange var,0
で実装できますが、値を読み取るためのアトミック命令はありません。
値を変更せずに値を読み取る場合は、std::atomic<bool>
が必要です。
ちょうどあなたの本を引用したいと思っていた.... – haohaolee
私はそれをデバッグ目的の値として印刷したいと思うので、本当に気にしないでしょうか?私は今、 '.__ val'要素を使っていますが、gccのいくつかのバージョンでは間違っています(正しいと思いますので) – user1273684
' std :: atomic_flag'の値を変更せずにそれ。 (printfのデバッグの場合でも)それを読むには 'std :: atomic
あなたは、スレッドが終了する必要があるかどうかを判断するためにatomic_flag
を使用したい場合、あなたはこのようにそれを行うことができます。
初期化:
std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();
糸ループ:
while (keep_running.test_and_set()) {
// do thread stuff
}
ますスレッドを終了したい:
keep_running.clear();
- 1. 状態パターンC++
- 2. 最小クエリ休止状態
- 3. C#LINQ DeleteOnSubmit()の状態
- 4. C#スレッド競合状態
- 5. C++ TR2ファイルシステムライブラリの状態は?
- 6. 標準C++トランザクションメモリの状態
- 7. C++有限状態マシン
- 8. c#checkboxes状態の確認
- 9. C++の実装状態
- 10. atomic_flagのデフォルトのコンストラクタが状態を未定義にする理由を教えてください。
- 11. iCloudのビジー状態のクエリcaldav
- 12. 状態ごとのSqlクエリ計算列
- 13. のSybase ASE 15 +休止状態:クエリ
- 14. React/Apolloの共有クエリ状態
- 15. クエリ可能状態をリセットする
- 16. セッション状態とアプリケーション状態
- 17. Facebook C#SDKセッション状態の維持
- 18. MVC3:C#フォーム認証とセッション状態
- 19. C# - パラレルポート状態(シンプルプッシュスイッチ)を読む
- 20. RabbitMQ Obj-Cクライアント接続状態チェック
- 21. Objective-Cの有限状態マシン
- 22. C#スレッド:競合状態の例
- 23. Cの文字列の開始状態
- 24. Cでスレッドの状態を取得++ /窓
- 25. 有限状態マシン:複数の状態への1つの状態
- 26. 初期状態/後状態のアニメーション
- 27. 状態値が「未定義」状態onChange
- 28. 休止状態で休止状態
- 29. ...状態、{}とObject.assign({}、状態、{})の相違点
- 30. 状態
その唯一の用途はロックを取得する手段であると思われます。 'std :: atomic_flag'を共有リソースにアクセスする前に取得できるロックとして使うことができますが、その共有リソースが単に' bool'であれば、 'std :: atomic '。 _Edit:_またはむしろstd :: atomic_bool、彼らはあなたのために1つの専門の悩みに行ってきた方法を見て! –
Rook
正しい取得/解放のセマンティクスを使用していない場合(つまり、atomic_flag_setでロックしてから実際に値を変更した場合のみ)、現在の状態を知ることはできません。それを読むだけで、あなたがそれを読んだときの価値は何かを教えてくれるでしょう、そして、それはすぐ後に変わったかもしれません。 –
@Mike:それは本当に重要ですか? OPが望んでいるような音は、アトミックな読み込みを実行する能力と、順序付けされた読み書きの概念を持つ能力です。 – Rook