在C 中,发送者接收器模型中的多线程
Multi-threading in a sender-receiver model in C++
我正在尝试在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
可以由几个发件人更新,但是发件人独立工作(要求),因此我担心并发。
所以我问
- 如何解决这个多范围的问题?
- 如何确定是否已收到所有数据?
我将感谢一些想法,模式,概念等。
首先,恕我直言,这是对您的问题的过度简化。我认为,例如,您的数据不能简单地是double
。
无论如何:
- 如果在您的体系结构中您有种族条件(如果每个节点都有自己的线程,那么您显然有种族条件),我看不到任何解决方案,但是
mutex
。 - 它取决于实际任务的财产和复杂性,但是您可以应用一些规则,让节点能够了解数据包的寿命(某些想法:数据包的序列编号,近节点的列表等)。 )。
要保护一个变量,我建议您使用测试和集合方法,这是一种简单的机制,用于同步对多个线程共享的变量的访问。
在Windows
中,最常见的方法是使用Interlockedexchange函数。
对于Linux,只需使用此包装器[1]:
template<typename T> T InterlockedExchange(T& data, T& new_val)
{
return __sync_lock_test_and_set(&data, new_val);
}
相关文章:
- QTableView:endMoveRows在模型中重置水平页眉大小
- 将IBM Rhapsody模型集成到VS 2019中
- 旋转模型矩阵时的形状失真
- 成员函数调用和C++对象模型
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 打印 ONNXRUNTIME::图形没有模型
- C++内存模型和位字段的最大序列
- 使用SIR模型的疾病爆发模拟
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何在 ECS 模型中组织实体?
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- Libtorch:如何加载ONNX模型?
- 使用 assimp 加载模型 - 不需要提升?
- 如何将经过训练的机器学习模型保存在python中并将其加载到C++中进行预测?
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 如何更改古罗比C++模型中的目标值系数
- 如何在 openGL 中围绕全局轴旋转模型?
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- ASIMP 模型加载不会加载所有网格
- 在C 中,发送者接收器模型中的多线程