私は多くの例がstd::mutex
を使用しているのを見ましたが、ここでmutexはグローバルです。これがなぜ行われたのか、具体的な理由があるのでしょうか?私はこれをやっていない私自身のプログラムを持っていて、単にmutexをstd::thread
std::ref
として渡します。グローバルを持つことは悪い習慣ではないですか?これを行う言語を制限する言語がない場合、std::mutexes
はC++のグローバルな裏にある合理的なものは何ですか?関数のパラメータとしてstd :: threadに渡されるのではなく、C++ 11以上のstd :: mutexをグローバル変数として宣言する必要がありますか?
答えて
そうでない場合を除いて、グローバルを持つことは悪い習慣です。たとえば、std::cin
はグローバルです。
mutexは、どのように利用できるかにかかわらず、グローバルな意味を持ちます。異なるコード間で共有されます。だからあなたはそれらをグローバルにすることができます。あるいは、コールチェーンの下に、それらを使用しない関数を通して、あなたが最終的に誰かに到達するまでそれらを渡すことができます。これは「トランプデータ」と呼ばれ、「悪い習慣」でもあります。あなたの毒を選んでください。
サイドノート:さまざまなデータ(mutexなど)を1つのオブジェクトにまとめることで、少なくともトランプの数を最小限に抑えることができます。 1つの引数を多くの数よりもむしろコールチェーンに渡すだけでよいのです。 –
@JeremyFriesner - はい、インコヒーレントなタイプを作成して、悪いデザインを簡単に実装できます。
一部の人々は '
この例は、例を簡単にするために行われた可能性が高いので、正確な詳細ではなく、ミューテックス自体を使用することができます。
通常、ミューテックスはリソースを保護します。多くの場合、ミューテックスはリソースと一緒に存在することが理にかなっています。たとえば、メンバコンテナを持つクラスがあり、そのメンバコンテナがミューテックスで保護されている必要がある場合は、そのミューテックスをクラスのメンバにもします。次に、クラスインスタンスが複数のスレッドによって処理されるため、メンバーmutexを使用して、内部コンテナへの必要なアクセスを保護することができます。
- 1. std :: mutexロック関数とstd :: lock_guardの相違点<std::mutex>?
- 2. std :: mutexを引数としてメンバー関数をスレッディング
- 3. サブ関数のグローバル変数を宣言する必要はありません
- 4. std :: condition_variableなぜstd :: mutexが必要なのですか
- 5. std :: thread関数の引数としてifstreamを渡すにはどうすればよいですか?
- 6. C++ 11:MacのClangはstd :: thread関数によってスローされた例外をキャッチしませんか?
- 7. std :: unique_ptrがstd :: threadで機能するためのパラメータとして
- 8. std :: sortはC++でラムダ関数で動作する必要がありますか?0x/C++ 11?
- 9. ロックはグローバルとして宣言する必要がありますか?
- 10. なぜC++テンプレートパラメータをクラス型として宣言する必要がありますか?関数テンプレートの
- 11. std :: threadメンバ関数。このポインタによってクラスフィールドにアクセスする必要がありますか?以下のようなクラスを考えると
- 12. Android NDK:エラー:-std = C++ 11または-std = gnu ++ 11コンパイラオプションで有効にする必要があります
- 13. グローバル変数として宣言することなく、Pythonでグローバル変数を使用できますか?
- 14. 空の関数を使ってstd :: threadを実行すると、大量のメモリが必要になる
- 15. C++のstd :: threadへの参照でオブジェクトを渡す11
- 16. 関数から関数を返すときに配列を静的として宣言する必要があるのはなぜですか。 (C++)
- 17. 関数のポインタとstd :: functionを引数としてテンプレート化されたパラメータを持つ関数を渡す
- 18. Cでグローバル変数を宣言するとエントリポイントが変更されますか?
- 19. std :: mutexがstd :: coutのために正しくロックされていない
- 20. C++のstd :: threadに関する問題11
- 21. 変数のみを読み込むにはグローバル変数を宣言する必要がありますか?
- 22. 宣言する必要なしに関数に__LINE__変数を渡す
- 23. C++ 11 std :: functionは、関数ポインタが持つことができる引数の数を制限しますか?
- 24. 関数からグローバル変数を宣言しようとしています
- 25. std :: functionの代わりに関数を引数として渡す(コールバックなど)
- 26. 一般的に宣言された変数をグローバル変数として宣言することに利点はありますか?
- 27. 関数宣言にパラメータ名を含める必要がありますか?
- 28. C++ 11 std :: threadとCシステムスレッド(つまりpthreads)を混在させる
- 29. テーブル変数とエラー "スカラー変数を宣言する必要があります"
- 30. gcc -std = C++ 11を使用しているときにCygwinでいくつかのシステム関数が定義されていないのはなぜですか?
理由はありません。この例では、コードを減らすために多分行われました。 – NathanOliver
おそらく作者が 'std :: reference_wrapper'の構文を嫌うからです) –
それはまったく依存しています。彼らはかなり簡単なプログラムですか?それらは複数のファイルで構成されていますか?詳細が必要です。通常、グローバルは悪い習慣とみなされ、避けるべきです。通常、私のmutexはクラスメンバ変数になりがちです。ロックを必要とするオブジェクトにそれらを配置することは、しばしば自然です。 – Galik