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
は、いくつかの送信者によって更新することができますが、送信者(必須)独立して動作し、したがって、私はの怖いです並行性が生じます。
だから、私は約
- このマルチthereadingの問題を解決する方法を求めていますか?
- すべてのデータを受信したかどうかを判断する方法は?
私はいくつかのアイデアのために感謝してます、パターン、概念など
。あなたがアイデアを求めてから、空白の紙を取り出し、このタスクを実装するために提案したアルゴリズムを短く簡潔に記入してください。あなたが終わったら、[ラバーダックで予約する](https://en.wikipedia.org/wiki/Rubber_duck_debugging)。ラバーダックがあなたの計画を見直して承認した後、書いたものをそのままC++に直接変換してください。任務完了。 –