4

同じプロセス内のスレッドは同じアドレス空間を共有するため、直接メモリ アクセスとミューテックスを介してこれらのスレッド間でデータを転送できます。このコンテキストでは、以下の質問があります。

  1. スレッド間通信には、グローバル変数とミューテックスだけで十分ですか?
  2. 質問 1 が当てはまらない場合、どのような状況で直接メモリ アクセスの代わりに他の IPC を選択する必要がありますか? または、グローバル変数やミューテックスを使用するよりも、他の IPC 手段が適しているのはどのような状況でしょうか?

ありがとう。

UPDATE
「グローバル変数」に関する誤ったステートメントを指摘してくれた@ssyamに感謝します。
元の段落に多くのコメントが寄せられているため、元の段落を修正する以外に、もう 1 つのセクションを追加することにしました。

4

4 に答える 4

1

グローバル変数は必要ありません。スレッド ルーチンはパラメーターを受け取ることができるため、動的に割り当てられたものを含め、任意の種類の変数である可能性があることに注意してください。

通常、スレッドをクラス内に「ラップ」する必要があります。次のようなものです。

struct Thread
{
    Thread() : m_thread(&Thread::run, this) {}
    void run()
    {
        // access the current object's member variables, eg:
        do_something_with(m_myvar);
    }

    Object m_myvar;
    std::thread m_thread;
};

condition_variableしかし、グローバル変数のこの小さな詳細を脇に置いておけば、あなたの #1 は正しいです...ミューテックスとオプションで(ウェイクアップ トリガーとして機能する) によって保護された変数 (メッセージ キュー、ブール値など) を介した通信ほとんどの場合、行く方法です。

私はほとんどの場合、スレッドセーフなメッセージキュー (つまり、) を使用してスレッドstd::queue + mutex + condition_variable間 (プロデューサー/コンシューマーパターン) を通信することになります。これは、スレッドを分離して通信できるようにするための非常に効率的な方法です。


実際、1 つのプロセス内で直接メモリ アクセス以外の方法が有効な場合はほとんどありません。

私が今考えることができるのは、すでにいくつかのプロセス間コード(ソケットや共有メモリなど)が機能している場合、このコードを再利用して、プロセス内またはプロセス間で統一されたインターフェースを可能にすることです。コミュニケーション。ただし、自分をからかわないでください。直接メモリアクセスとして効率が低下しますただし、統一されたインターフェースの利点により、効率の低下を簡単に克服できます。私見、あなたは本当にケースバイケースでこの種のものに対処する必要があります.

于 2013-08-25T01:33:20.550 に答える
0

ここに考えがあります:

2 つのスレッドが同じメモリにアクセスしている場合でも、必ずしも同じ値が表示されるとは限りません。1 つのスレッドが値を更新している場合、もう 1 つのスレッドは古い値 (プロセッサのローカル キャッシュから取得された更新前の値) を見ることができます。これが起こらないようにするには、ミューテックスまたはその他の手法を使用してスレッドを同期する必要があります。

手法に関係なく、ローカル キャッシュは、「メモリ バリア」と呼ばれるものを使用してフラッシュする必要があります。これは、すべてのプロセッサが実行中の操作を停止して操作が完了するまで待機する必要があるため、非常にコストのかかる操作です。

一方、IPC コールでは、必ずしもそれが必要なわけではありません。

于 2013-08-25T01:31:12.050 に答える
0

グローバル変数は、シングル スレッド コードでは不適切であり、マルチスレッド コードでは一般的に大きな問題になります。ミューテックスで同期がきちんと取れていても、ボトルネックになりがちです。また、ミューテックスは通常、スレッド間通信には十分ではありません。通常、少なくとも条件変数も必要です。

とはいえ、マルチスレッド アプリケーション内では、メモリ内のスレッド間でデータを転送するのが合理的です。ただし、一般的に、明示的なロックを処理することは実行できないことがわかりました。メッセージがメモリ内のデータ構造であっても、メッセージ パッシング システムと同様にデータを転送する場合、コードはそれほど複雑ではなく、より効率的です。その意味で、メッセージは常に 1 つのスレッドによってのみ使用され、発生する唯一のロックはメッセージ パッシング機能で暗黙的に行われます。

于 2013-08-25T01:32:58.610 に答える