ダミーだと思うかもしれませんが、混乱していると思いますが、これを見てみると同じ状況に見える場合はquestionです私は自分のmap
を静的なものにする必要があるので、別のthreads
で作成されるすべてのインスタンスに共通であり、私のマップ上で動作する関数を同期したいので、私はstd::mutex
を私のクラスのstatic
この場合、mutex
自体を取得してロックする競合状態が発生するでしょうか?静的ミューテックスのためにレースの条件を作成すると、我々はmutex
std :: mutexを静的にすると、mutex自体の競合条件が生成される
答えて
を使用して
static map
上の機能を同期させることができる任意のより良い方法があるにはありません、Mutexレースに対して脆弱ではありません 自体
をstd::mutex
を作るん-条件。そして、それをstatic
として初期化する場合、あなたは安全です。
$6.7: 4:静的記憶期間を持つブロックスコープ変数の動的な初期化([basic.stc.static])またはスレッドストレージ 持続時間は、([basic.stc.thread])最初の時間制御 を行いますその宣言を通過する。そのような変数は、その初期化の完了時に初期化されたと考えられます( )。 初期化が例外をスローすることによって終了する場合、初期化は が完了していないため、次回にコントロールが 宣言を入力したときに再試行されます。コントロールは、変数が初期化され、同時に ながら宣言を入力した場合、同時実行は、初期化の完了を を待たなければなら
あなたは言った:
iが
std::mutex
などを行うことを考えました指定されたリンクの答えとして が提案されたような、私のクラスの静的です。
また、static
のクラスメンバー変数も保護しようとしていますか?それ以外の場合は、mutable
メンバーにしてください。 map
がグローバルに初期化されると言ったという事実はstatic
です。メンバ変数としてのmutexはスイートに従うので、大丈夫です。今
class Map{
public:
Map(...){}
std::size_t size() const{
std::lock_guard<std::mutex> lck(m_m);
return m_size;
}
iterator add(....) {
std::lock_guard<std::mutex> lck(m_m);
....
return your_iterator;
}
...etc
private:
mutable std::mutex m_m; //FREE ADVICE: Use a std::recursive_mutex instead
...others
};
:
//Somewhere at global scope:
Map mp(... ...);
// NOTES
// 1. `mp` will be initialized in a thread safe way by the runtime.
// 2. Since you've protected all Read or Write member functions of the class `Map`,
// you are safe to call it from any function and from any thread
号
ミューテックス(および他の同期プリミティブ)は、オペレーティングシステムからのサポートを使用して実装されています。それが彼らの仕事を行う唯一の方法です。
このジョブを実行する能力の直接コロラドは、自身が競合状態になりにくいことです。— mutexのロックとロック解除の操作はアトミックです。
そうでなければ、あまり役に立ちません。ミューテックスを使うたびに、別のミューテックスでそのミューテックスを保護してから、そのミューテックスを別のミューテックスで保護しなければならなくなります。無限のミューテックスがあるまで、まったく。 :)
std::mutex
静止保存期間を持つオブジェクトは、これを変更しません。おそらく、あなたは関数 - static
の変数を考えていたでしょう(競合状態に耐えられていないと仮定すると、それらは異なるスレッドによって同時にアクセスされる可能性があるので同期されなければなりませんが、理想的には、機能をリエントラントにしない)。
- 1. g ++/std :: mutexでロック競合をプロファイルする方法は?
- 2. std :: mutexロック関数とstd :: lock_guardの相違点<std::mutex>?
- 3. 何より良いstd :: lock_guard <std::mutex>ロック(std :: mutex mutex_var);またはstd :: mutex mutex_var.lock();
- 4. なぜmutexはmutexを必要としないのですか?mutexにはmutexが必要です...
- 5. mutexのデッドロック、条件変数コード?
- 6. 静的なmutexで静的なlock_guardもありますか?
- 7. 複数のスレッドとmutexを使用する場合のmutexでのアサーション
- 8. 条件変数でnotifyを呼び出すと、mutexがロック解除されるのですか?
- 9. 原子インデックスを持つmutex配列からmutexをロックする
- 10. mutexで挿入をロックしているにもかかわらず、std :: unordered_mapとのデータ競合
- 11. std :: mutexがstd :: coutのために正しくロックされていない
- 12. condition_variable、mutex、flagを1つの構造体に入れます
- 13. なぜmutexと条件変数は簡単にコピー可能ですか?
- 14. なぜboost :: mutexはvs2013のstd :: mutexより速いのですか?
- 15. std :: condition_variableなぜstd :: mutexが必要なのですか
- 16. std :: mutexとstd :: condition_variable構築オーバーヘッドとヒープ割り当て
- 17. 異なるスレッドでstd :: mutexを使用するには?
- 18. asyncioとの競合条件
- 19. <mutex>がCLRライブラリにある静的ライブラリを使用しています
- 20. mutexの方が効率的ですか?
- 21. mutexと条件変数の間には何が決定的な違いがありますか?
- 22. メンバstd :: mutexを安全に削除する方法?
- 23. `std :: mutex`との同期が` std :: atomic(memory_order_seq_cst) `よりも遅いのですか?
- 24. ブーストスレッドのリソースとmutex
- 25. SQL Serverと競合条件
- 26. std :: lock_guardの短縮形は<std::mutex> lock(m)ですか?
- 27. boost :: signals2 :: mutexとboost :: thread :: mutexの違いは何ですか?
- 28. absl :: Mutexの条件付きクリティカルセクションでリーダーウェイクアップを処理する方法
- 29. Pythonオブジェクト内で宣言されたC++ std :: mutexを使用する
- 30. std :: mapのマップされた型としてboost :: mutexを使う方法?
明らかに、最初のミューテックス – Praetorian
を保護するためには2番目のミューテックスを使用する必要があります(私は冗談ですが、データ競合の影響を受けやすいミューテックスは無意味です) – Praetorian
@Praetorian。あなたの最初のコメントに、私はWTFを入力しようとしていました...ハハ – WhiZTiM