84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
#include <mutex> int a; char c; std::mutex t; int main() { std::lock_guard<std::mutex> zz(t); a = 2; c = '1'; return 0; }
如上面这小段代码,请问c++11中的mutex,是不是只要mutex被锁住了,就是默认对所有的共享数据加上了锁?
认证0级讲师
锁的范围取决于你的lock的作用域,那么在你这个测试程序中就是锁住了main作用域了。当然你这个示例程序本身是没有意义的哈,因为不是用在多线程下。假设是多线程吧,这时别的线程在尝试锁mutex时就需要等你这里的mutex锁释放,也就是说某一时刻只有一个线程能访问变量a和c。
加锁以后,互斥锁就被保持住,除非当前线程释放,当前线程在获得锁的时候就已经执行完这一行代码,进入了下一行执行,因此它有释放互斥锁的资格。而等待该锁的其它线程在锁释放前都会沉睡在这一行代码,直到被操作系统从等待队列中唤醒。
互斥锁对资源访问进行把控。进入临界区需要获得锁,此时该线程拥有了对资源消耗的权力,也就是对共享数据修改的权力。退出临界区需要释放锁,将锁释放掉给其它线程继续执行。
简单的说,不会。Mutex是一种锁,它只是保证同时有一个线程可以锁住它,但是全局变量怎么控制是你自己代码实现的。也就是一种约定,如果另外一个线程不去先试图锁定Mutex,而是直接去修改那些全局变量,是不会被阻止的。
锁的范围取决于你的lock的作用域,那么在你这个测试程序中就是锁住了main作用域了。
当然你这个示例程序本身是没有意义的哈,因为不是用在多线程下。假设是多线程吧,这时别的线程在尝试锁mutex时就需要等你这里的mutex锁释放,也就是说某一时刻只有一个线程能访问变量a和c。
加锁以后,互斥锁就被保持住,除非当前线程释放,当前线程在获得锁的时候就已经执行完这一行代码,进入了下一行执行,因此它有释放互斥锁的资格。而等待该锁的其它线程在锁释放前都会沉睡在这一行代码,直到被操作系统从等待队列中唤醒。
互斥锁对资源访问进行把控。进入临界区需要获得锁,此时该线程拥有了对资源消耗的权力,也就是对共享数据修改的权力。退出临界区需要释放锁,将锁释放掉给其它线程继续执行。
简单的说,不会。Mutex是一种锁,它只是保证同时有一个线程可以锁住它,但是全局变量怎么控制是你自己代码实现的。也就是一种约定,如果另外一个线程不去先试图锁定Mutex,而是直接去修改那些全局变量,是不会被阻止的。