2017-09-25 18 views
0

C++で送信者 - 受信者モデルを構築しようとしています。フィードフォワードで送信者から受信者にデータを送信したい。まもなく、所望のアーキテクチャは、(基本単位はノード呼ばれる)ように同様に表すことができ:C++の送信者 - 受信者モデルのマルチスレッド

各ノードが別のノード(に)から(送信)データを受信することができます。各ノードには、送信者(受信者)が必要な数だけ存在します。各ノードは、インパルスと呼ばれる番号を有し、これは送信されるべきデータである。ネットワーク全体を通して1つのデータ伝播をサイクルとしましょう。次に、1つのサイクルで、ネットワークに属する各ノードは、すべての受信者に一度だけインパルスを送信する必要があります。

上記の考え方の実装の傷は次のとおりです。

class Node 
{ 
    private : 
    double in_signal;//received data 
    double out_signal;//data to send 
    bool is_opened;//status of channel 

    void update_in(double package);//receive new package 

    protected : 
    std::vector<Node*> receivers; 

    public : 
    Node(double out_signal) 
    : in_signal(0.), 
     out_signal(out_signal), 
     is_opened(false) 
    {} 
    ~Node() {} 

    void add_receiver(Node* receiver); 
    void emit();//send out_signal or impulse 
}; 

void Node::update_in(double package) 
{ 
    //the problem is how to control the status of the channel: 
    //it must be closed after getting all data 
    if (not is_opened) 
    { 
    in_signal = 0.;//reset 
    is_opened = true; 
    } 
    in_signal += package; 
} 

void Node::add_receiver(Node* receiver) 
{ 
    receivers.push_back(receiver); 
} 

void Node::emit() 
{ 
    for (auto& receiver : receivers) 
    { 
     receiver->update_in(out_signal); 
    } 
} 

私は解決できない問題がこのアーキテクチャ後ろにマルチスレッドさ:

ノードのin_signalは、いくつかの送信者によって更新することができますが、送信者(必須)独立して動作し、したがって、私はの怖いです並行性が生じます。


だから、私は約

  1. このマルチthereadingの問題を解決する方法を求めていますか?
  2. すべてのデータを受信したかどうかを判断する方法は?

私はいくつかのアイデアのために感謝してます、パターン、概念など

+0

。あなたがアイデアを求めてから、空白の紙を取り出し、このタスクを実装するために提案したアルゴリズムを短く簡潔に記入してください。あなたが終わったら、[ラバーダックで予約する](https://en.wikipedia.org/wiki/Rubber_duck_debugging)。ラバーダックがあなたの計画を見直して承認した後、書いたものをそのままC++に直接変換してください。任務完了。 –

答えて

1

まず第一には、私見、これはあなたの問題について単純化し過ぎです。 たとえば、あなたのデータは単純にdoubleであるとは限りません。とにかく

  1. もしあなたのアーキテクチャでは、競合状態を持っている(各ノードがそれ自身のスレッドを持っている場合、あなたは明らかに競合状態を持っている)、私はすべてのソリューションが、mutexが表示されません。
  2. 実際のタスクの複雑さと複雑さに依存しますが、ノードがパケットの存続時間を理解できるようにするルールを適用することもできます(パケットのシーケンス番号、近くのノードのリストなど)。
1

変数を保護するには、テストと設定の方法を使用することをお勧めします。これは、複数のスレッドによって共有される変数へのアクセスを同期する簡単なメカニズムです。

Windowsでこれを行う最も一般的な方法は、InterlockedExchange機能を使用することです。Linux用の

はちょうどこのラッパー [1]を使用します。

マルチスレッドを必要と説明したタスク内の何もない
template<typename T> T InterlockedExchange(T& data, T& new_val) 
{ 
    return __sync_lock_test_and_set(&data, new_val); 
} 
関連する問題