【发布时间】:2021-01-27 16:02:38
【问题描述】:
我想应用尽可能简单的互斥锁。
#include <iostream>
#include <thread>
#include <vector>
#include <functional>
#include <algorithm>
#include <mutex>
using namespace std;
int sum;
static mutex m;
void addValue(int value)
{
m.lock();
sum += value;
m.unlock();
}
int main()
{
int counter1 = 0;
int counter2 = 0;
for (int i = 0; i < 100; i++)
{
thread t1(addValue, 100);
thread t2(addValue, 200);
if (sum == 300)
{
counter1++;
}
else
{
counter2++;
}
sum = 0;
t1.join();
t2.join();
}
cout << counter1 << endl;
cout << counter2 << endl;
}
不幸的是,上面提到的代码没有按预期工作。我希望:
a) 总和总是等于 300
b) counter1 始终为 100
c) counter2 始终为 0
怎么了?
编辑:
当我在else 条件下调试sum 变量时,我看到如下值:
200、400、100 甚至 0(我认为加法甚至没有发生)。
【问题讨论】:
-
读取值时还必须获取互斥锁。
-
如果需要,请在阅读总和之前加入线程。
-
这听起来不太好,因为您每次迭代都会杀死并重新生成线程,不是吗?
-
为什么你希望
sum是300在你知道线程已经完成之前? -
附带说明,您不应该手动锁定和解锁
std::mutex。请改用std::lock_guard或std::scoped_lock,例如:{ std::lock_guard<std::mutex> lock(m); /* read-write sum as needed */ }
标签: c++ thread-safety mutex race-condition data-race