在C 中,发送者接收器模型中的多线程

Multi-threading in a sender-receiver model in C++

本文关键字:模型 接收器 多线程 发送者      更新时间:2023-10-16

我正在尝试在C 中构建发件人模型。我想以馈送方式将来自发件人的数据发送给接收器。不久,所需的架构可以像这样表达(基本单位称为 nodes ):

每个节点可以从(到)另一个节点接收(发送)数据。每个节点都有尽可能多的发件人(接收器)。每个节点都有一个称为 impulse 的数字,该数字应该发送数据。让我们通过整个网络调用一个数据传播a 循环。然后在一个周期中,每个属于网络的节点必须向其所有接收器发送一次冲动一次。

上述想法的实现的划痕是以下内容。

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. 如何解决这个多范围的问题?
  2. 如何确定是否已收到所有数据?

我将感谢一些想法,模式,概念等。

首先,恕我直言,这是对您的问题的过度简化。我认为,例如,您的数据不能简单地是double

无论如何:

  1. 如果在您的体系结构中您有种族条件(如果每个节点都有自己的线程,那么您显然有种族条件),我看不到任何解决方案,但是mutex
  2. 它取决于实际任务的财产和复杂性,但是您可以应用一些规则,让节点能够了解数据包的寿命(某些想法:数据包的序列编号,近节点的列表等)。
  3. )。

要保护一个变量,我建议您使用测试和集合方法,这是一种简单的机制,用于同步对多个线程共享的变量的访问。

Windows中,最常见的方法是使用Interlockedexchange函数。

对于Linux,只需使用此包装器[1]:

template<typename T> T InterlockedExchange(T& data, T& new_val)
{
    return __sync_lock_test_and_set(&data, new_val);
}