#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被锁住了,就是默认对所有的共享数据加上了锁?
巴扎黑2017-04-17 16:30:49
锁的范围取决于你的lock的作用域,那么在你这个测试程序中就是锁住了main作用域了。
当然你这个示例程序本身是没有意义的哈,因为不是用在多线程下。假设是多线程吧,这时别的线程在尝试锁mutex时就需要等你这里的mutex锁释放,也就是说某一时刻只有一个线程能访问变量a和c。
PHPz2017-04-17 16:30:49
加锁以后,互斥锁就被保持住,除非当前线程释放,当前线程在获得锁的时候就已经执行完这一行代码,进入了下一行执行,因此它有释放互斥锁的资格。而等待该锁的其它线程在锁释放前都会沉睡在这一行代码,直到被操作系统从等待队列中唤醒。
互斥锁对资源访问进行把控。进入临界区需要获得锁,此时该线程拥有了对资源消耗的权力,也就是对共享数据修改的权力。退出临界区需要释放锁,将锁释放掉给其它线程继续执行。
巴扎黑2017-04-17 16:30:49
简单的说,不会。Mutex是一种锁,它只是保证同时有一个线程可以锁住它,但是全局变量怎么控制是你自己代码实现的。也就是一种约定,如果另外一个线程不去先试图锁定Mutex,而是直接去修改那些全局变量,是不会被阻止的。