gpt4 book ai didi

c++ - 线程之间的实时数据共享

转载 作者:行者123 更新时间:2023-11-30 01:36:00 28 4
gpt4 key购买 nike

对于嵌入式系统项目,我必须处理同时发送大量数据的传感器。目前,每个传感器都有自己的线程,许多线程相互引用。

使用互斥锁,这些线程相互获取数据。然而,在生产过程中,一些线程会无限期地等待另一个线程来完成对锁定数据的处理。我知道这个问题与死锁有关,但我发现这些问题很难发现和预防。

我想避免如此广泛地使用互斥锁,因为它们会导致我的大部分问题难以重现。我已经尝试了很多事情,例如当互斥锁超出范围时自动解锁,但到目前为止没有任何效果。我有一个包含以下方法的 SharedData 类:

```
template<class T>
T SharedData<T>::Get() {
LockGuard lock(mutex_);
T data = data_;
if (!IsValid() && has_default_value_) {
data = default_value_;
}

return data;
}

template<class T>
void SharedData<T>::Set(T data) {
is_set_ = true;
set_time_ = system_clock::now();

LockGuard lock(mutex_);
data_ = data;
}
```

我的问题如下;在线程之间共享实时数据的安全好方法是什么(最好不使用互斥锁)?

我正在寻找线程间消息传递方向的解决方案。我还没有找到一种优雅的方式来做到这一点。

提前致谢!

编辑:为了阐明“线程相互获取数据”,这里是一个代码片段:

void MotorMessage::SetConnectedModules(MotorSensor &motor_sensor) {
out_buffer_[index_++] = motor_sensor.connected_.Get();
}

这里的 motor_sensor 是对不同线程的引用,而 connected_ 是 SharedData 类型。

最佳答案

您可以设置一个或多个从传感器线程到消费者的原子队列。这样您就不必自己进行任何锁定。

例如,来自 Intel TBB 的队列.

关于c++ - 线程之间的实时数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52704628/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com