5

多くのクラスを持つC++マルチスレッドアプリケーションで、グローバル変数を定義するメソッドを見つけようとしています

  1. Cスタイル、任意の1つのソースファイルでグローバルとして定義し、この変数にアクセスするクラスに含まれるヘッダーでexternとして定義します。

  2. これらのグローバル変数を含み、変数に書き込むためのset/getメソッドを公開するシングルトンクラスを記述します。

2番目の方法では、最初のアプローチではなく、集中管理された方法でロックを介してマルチスレッドアクセスを制御できます。

より多くのより良い方法がありますか?

4

9 に答える 9

4

まず、グローバル変数をできるだけ避けてください。あなたがそれをする必要があるだけなら(例えば、これは、の場合です)cin、あなたの2番目の方法は間違いなくそれをするための最良の(そしてより自然な)方法です。coutcerr

于 2010-08-25T16:09:06.963 に答える
3

私は間違いなくシングルトンクラスに行きます。これは、マルチスレッドOOP環境で「グローバル」変数を処理するための最良の方法です。

于 2010-08-25T16:04:38.407 に答える
3

「グローバル変数」の範囲を絞り込むことができる場合(通常は、実際にグローバルな変数はいくつありますか?)、適切な所有クラスのプライベート静的クラスメンバーにすることができます。他のクラスがそれを表示する必要がある場合(または、可能性は低いですが、更新する必要がある場合)、get/putアクセサーを提供します。

于 2010-08-25T16:17:48.860 に答える
1

グローバル変数を使用する必要がある場合(そしてなぜそれを使用するのですか?)、私はあなたが説明した2番目の方法をお勧めします。最初の方法は、あらゆる種類の名前空間の問題に遭遇する可能性がある方法です。

于 2010-08-25T16:05:47.403 に答える
1

この問題は、代替方法で非常に簡単に解決できます。

C ++は、スコープ解決演算子と呼ばれる新しい演算子::によって、この問題を非常に簡単に解決します。構文は次のとおりです

:: variable-name;

この演算子は、vriableのグローバルバージョンへのアクセスを許可します。

于 2010-08-25T16:24:01.107 に答える
1

2番目の方法を好む傾向があります。これは、より適切な制御ができるように見えるためですが、シナリオによってはあまり役に立たない場合があります。

まず、OOPの哲学を理解する上で、私はオブジェクトを一連のデータのコレクションとは見なしませんが、その観点から、実世界の問題を表すことができるエンティティと見なします。したがって、ランダムデータを格納するクラスを用意するのは良い考えではないと思います。特に、データメンバーがほとんど無関係である場合。

第二に、あなたが中央制御を持つことを考えているなら、例えば。すべてのデータメンバーにアクセスするための単一のミューテックスがあるため、これは無関係のデータメンバーにはうまく機能しません。必要なデータが現在ロックによって保護されているデータと正確に一致していない場合でも、多くのスレッドを不必要にブロックすることになります。

奇妙に思えるかもしれませんが、私は最初の方法を好みます。

于 2010-08-26T11:22:07.273 に答える
0

それは目前の問題に依存します。

Cスタイルのグローバルには単純であるという利点があり、Singleton :: instance()呼び出しは必要ありません。ただし、Singleton :: instance()を使用すると、最初の呼び出しでグローバル状態を初期化できます。

両方の世界を最大限に活用するには、SchwarzCounterメソッドを使用して初期化されたCスタイルのグローバルを使用します。http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter

于 2010-08-25T16:16:19.713 に答える
0

単一の実装をhandle/bodyイディオムでラップする値オブジェクトを定義できます。

また、MT環境でシングルトンを実装することの難しさとそれらに対処する方法についての議論については、Alexandrescuによる「ModernC++Design」を確認してください。

于 2010-08-25T16:19:17.243 に答える
0

死んだ馬を蹴るのではなく、前述のように、グローバルを回避することが最善の解決策です。いくつかの理由がここにリストされています。グローバル変数が必須である場合は、いわゆる「グローバル初期化の大失敗」を回避するために、グローバル変数にアクセスするための関数を提供することを検討することをお勧めします。

于 2010-08-26T04:02:47.767 に答える