gpt4 book ai didi

c++ - 如何保证两个线程中的两个类写同一个变量线程安全?

转载 作者:行者123 更新时间:2023-11-27 23:55:28 30 4
gpt4 key购买 nike

我有两个类同时在 2 个线程中运行,比如 A 类和 B 类,A 正在收集一些数据API 并不断将更新的数据作为 B->m 推送到 unordered-map 中。同时B正在使用数据创建自定义类Bar,代码如下:

A 类:

if(m.size() > 0){
//mtx.lock();
lock = B->lock;
if(lock == false){
lock = true;
B->m = m;
lock = false;
}
m.clear();
//mtx.unlock();
}

B 类:

 while(true){
if(m.size() > 0){
//mtx.lock();
if(lock == false){
lock = true;
for (auto it : m) {
std::string symbol = it.first;
std::vector<double> v = it.second;
Bar b;
b.open = v[0];
b.high = v[1];
bars.push_back(b);
}
m.clear();

lock = false;
}
//mtx.unlock();
}}

从这里可以看出,我尝试使用一个名为 lock 的 bool 值手动实现互斥锁,当我编译时有时会完成有时会出现段错误,我认为这是因为边缘情况:当我在 B 类中将 lock 设置为 trueA 类刚刚跳过 if(lock == false) 并且 B 正在读取由 A 更改的数据。我的问题是,如何避免这种情况发生?

最佳答案

手动互斥量实现将不起作用(至少不是以一种简单的方式)。例如从编译器的角度来看这个

lock = strategy->lock;
if(lock == false){
lock = true;
B->m = m;
lock = false;
}

可以重新排列成这样

lock = strategy->lock;
if(lock == false){
B->m = m;
}

因为单线程结果(如果您不另外说明,这是编译器的默认观点)是完全相同的。

还有其他原因可能会失败,例如部分对象填充。通常是复杂的东西。

所以你必须使用你正在使用的库为你提供的一些同步对象。对于 C++11 及更高版本,您可以简单地使用 std::mutex :

#include <mutex>
std::mutex my_mutex;
...

// some code
{
// lock resource
std::lock_guard<std::mutex> lg(my_mutex);
B->m = m;
}
// automatically releases the lock and continues the execution

关于c++ - 如何保证两个线程中的两个类写同一个变量线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42929919/

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