0

コードを将来どのようにスケーリングする必要があるかわからないため、グローバル変数の使用を避けようとしています。そのため、独立したミューテックスで複数のスレッドを生成する機能が必要です。Mutex と条件付き変数をクラス コンストラクターに渡そうとしています。

ヘッダー ファイル:

class Receiver {
private:
    std::mutex & _global_mtx;
    std::condition_variable & _global_cv;
    bool & state;
public:
    // Construct
    Receiver(std::mutex &, std::condition_variable &, bool &);
};

コード ファイル:

/*-------------------------------------
    Construct
--------------------------------------*/
Receiver::Receiver(std::mutex & mtx, std::condition_variable & cv, bool & state){
    _global_mtx = mtx;
}

はすでに参照変数として宣言されているため、これは明らかに問題を引き起こしているため、参照を からに_global_mtx渡す方法がわかりません。mtx_global_mtx

また、参照を宣言するときは、参照に値を割り当てる必要があることを知っています(潜在的にNULL)ので、これを処理するより良い方法はありますか?この必要性に遭遇したのは私が最初で唯一の人ではないと確信していますが、どこで答えを探すべきかわかりません.

4

2 に答える 2

7

参照をデフォルトで初期化することはできません。彼らは何かを参照する必要があります。したがって、初期化 _global_mutexする必要があります。コンストラクターの初期化リストで実行します。

Receiver::Receiver(std::mutex & mtx, std::condition_variable & cv, bool & state)
: _global_mtx(mtx),
  _global_cv(cv),
  state(state)
{
}

同じことが他のデータメンバーにも当てはまります。

于 2013-11-12T15:55:05.723 に答える
0

私には、あなたのコードはやや混乱しているように見えます。

ほとんどの場合、ミューテックス (および、ミューテックスを使用している場合は、関連する条件変数) は、何らかのデータに直接関連付ける必要があります。つまり、スレッド間で共有されるデータの一部があります。ミューテックスをそのデータに関連付けて保護し、一度に 1 つのスレッドだけがデータにアクセスできるようにします。

その場合、通常は、共有データのインスタンス、ミューテックス、および (必要に応じて) 条件変数を使用してクラスを設計する必要があります。それらを個別に作成したくないことはほとんどなく、質問でやろうとしているようにクラスに提供します。メンバー初期化子リストを使用して参照を初期化するという短期的な (主に構文上の) 問題を修正できますが、それが正しい答えになることはめったにありません。

ほとんどの場合、正しい答えは、それらすべてが同じオブジェクトのメンバーであり、必要に応じてミューテキストをロックおよびロック解除して、メンバー データに対して操作を実行するメンバー関数を提供することです。

于 2013-11-12T16:13:44.910 に答える