2017-07-05 1 views
5

私は多くの例がstd::mutexを使用しているのを見ましたが、ここでmutexはグローバルです。これがなぜ行われたのか、具体的な理由があるのでしょうか?私はこれをやっていない私自身のプログラムを持っていて、単にmutexをstd::threadstd::refとして渡します。グローバルを持つことは悪い習慣ではないですか?これを行う言語を制限する言語がない場合、std::mutexesはC++のグローバルな裏にある合理的なものは何ですか?関数のパラメータとしてstd :: threadに渡されるのではなく、C++ 11以上のstd :: mutexをグローバル変数として宣言する必要がありますか?

+8

理由はありません。この例では、コードを減らすために多分行われました。 – NathanOliver

+0

おそらく作者が 'std :: reference_wrapper'の構文を嫌うからです) –

+1

それはまったく依存しています。彼らはかなり簡単なプログラムですか?それらは複数のファイルで構成されていますか?詳細が必要です。通常、グローバルは悪い習慣とみなされ、避けるべきです。通常、私のmutexはクラスメンバ変数になりがちです。ロックを必要とするオブジェクトにそれらを配置することは、しばしば自然です。 – Galik

答えて

4

そうでない場合を除いて、グローバルを持つことは悪い習慣です。たとえば、std::cinはグローバルです。

mutexは、どのように利用できるかにかかわらず、グローバルな意味を持ちます。異なるコード間で共有されます。だからあなたはそれらをグローバルにすることができます。あるいは、コールチェーンの下に、それらを使用しない関数を通して、あなたが最終的に誰かに到達するまでそれらを渡すことができます。これは「トランプデータ」と呼ばれ、「悪い習慣」でもあります。あなたの毒を選んでください。

+0

サイドノート:さまざまなデータ(mutexなど)を1つのオブジェクトにまとめることで、少なくともトランプの数を最小限に抑えることができます。 1つの引数を多くの数よりもむしろコールチェーンに渡すだけでよいのです。 –

+0

@JeremyFriesner - はい、インコヒーレントなタイプを作成して、悪いデザインを簡単に実装できます。 真剣にも、これは正当な技術です。それに言及してくれてありがとう。 –

+0

一部の人々は ''でグローバルについて批判しています...それは正しい方法である 'std'のように行われているわけではありません。 – Jarod42

0

この例は、例を簡単にするために行われた可能性が高いので、正確な詳細ではなく、ミューテックス自体を使用することができます。

通常、ミューテックスはリソースを保護します。多くの場合、ミューテックスはリソースと一緒に存在することが理にかなっています。たとえば、メンバコンテナを持つクラスがあり、そのメンバコンテナがミューテックスで保護されている必要がある場合は、そのミューテックスをクラスのメンバにもします。次に、クラスインスタンスが複数のスレッドによって処理されるため、メンバーmutexを使用して、内部コンテナへの必要なアクセスを保護することができます。

関連する問題