锁全局变量在两个不同的线程调用的两个不同的函数中



在下面的代码中,我使用2个线程在2个独立函数中增加全局变量。我用的是防盗锁。我得到了像func1这样先完成的输出。之后只有func2启动了。它像单线程代码。那么我应该怎么做才能锁定全局变量而不是函数呢?

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
// a global variable
int number;
std::mutex myMutex;
void func1(int interval)
{
std::lock_guard<std::mutex> lock (myMutex);
for(int i = 0; i< interval; i++)
{
cout<<"thread one " << ++number<<std::endl;
}
}
void func2(int interval)
{
std::lock_guard<std::mutex> lock (myMutex);
for(int i = 0; i< interval; i++)
{
cout<<"thread two " << ++number<<std::endl;
}
}
int main()
{
std::thread t1(func1, 1000);
std::thread t2(func2, 1000);
t1.join();
t2.join();
return 0;
}

移动锁for环:

for(int i = 0; i< interval; i++)
{
std::lock_guard<std::mutex> lock (myMutex);

这将使锁保持足够长的时间来增加共享对象。锁定在每次迭代结束时实现,并在开始时重新锁定。这给了其他执行线程一个获取它的机会。

注意,这仍然不能保证观察到的结果有任何变化(但是interval越大,观察到的结果发生变化的可能性就越大)。从理论上讲,结果输出完全不变仍然是可能的。无论如何,在没有任何其他同步逻辑的情况下,您绝对无法保证锁定顺序。

最新更新