c++的mutex是不是要关联某个数据才能上锁?
下图中的互斥到底关联了谁?还是都关联了?
下图中第一行的mutex是声明还是定义,这行代码有什么作用
c++的mutex是不是要关联某个数据才能上锁?
下图中的互斥到底关联了谁?还是都关联了?
不要想复杂了,你的图中仅仅是定义了几个变量,又怎么会有关联呢。
回归语言本质,mutex只是一个对象,我们最终用的是它里面的方法lock和unlock。
只有在lock和unlock之间的代码才是线程保护的,也就是说在lock和unlock之间我们用到了counter,这时mutex和counter才有了联系。
没有关不关联变量的说法。至于你说的后边再加一行int counter2=1;加了对mutex和整个程序没有任何的影响,仅仅是多了一个全局变量而已。
另外回答你的 “如果这个作用域有好几个变量和一个mutex,某个线程先拿到mutex并lock,那么其他线程就无法访问这好几个变量了”,对的,从程序角度上说。但如果考虑cpu乱序,就不准确了,这是题外话了。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 创建一个互斥锁
int counter = 0; // 共享数据
void increment() {
for (int i = 0; i < 100000; ++i) {
mtx.lock(); // 获取互斥锁
++counter; // 增加共享数据
mtx.unlock(); // 释放互斥锁
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << counter << std::endl; // 输出结果应为200000
return 0;
}
在这个例子中,std::mutex mtx;就是定义了一个全局变量mtx, int counter = 0;就是定义了一个int的全局变量,这时候这两者没有任何关系。
真正用到mutex和counter 产生关系的是这里:
mtx.lock(); // 获取互斥锁
++counter; // 增加共享数据
mtx.unlock(); // 释放互斥锁
通过lock和unlock把counter保护起来了,至于mutex在这里只是一个对象,没什么特别,我们只是用了mutex的方法而已。
当然在lock和unlock间我们可以加更多代码,更多的变量。
这里仅仅就是为了线程同步,使得counter 同一时间只能有一个线程访问。