84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
#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,而是直接去修改那些全局变量,是不会被阻止的。