登录

linux - 多线程编程中的mutex

#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被锁住了,就是默认对所有的共享数据加上了锁?

# Linux
PHP中文网PHP中文网2146 天前579 次浏览

全部回复(3) 我要回复

  • 巴扎黑

    巴扎黑2017-04-17 16:30:49

    锁的范围取决于你的lock的作用域,那么在你这个测试程序中就是锁住了main作用域了。
    当然你这个示例程序本身是没有意义的哈,因为不是用在多线程下。假设是多线程吧,这时别的线程在尝试锁mutex时就需要等你这里的mutex锁释放,也就是说某一时刻只有一个线程能访问变量a和c。

    回复
    0
  • PHPzhong

    PHPzhong2017-04-17 16:30:49

    加锁以后,互斥锁就被保持住,除非当前线程释放,当前线程在获得锁的时候就已经执行完这一行代码,进入了下一行执行,因此它有释放互斥锁的资格。而等待该锁的其它线程在锁释放前都会沉睡在这一行代码,直到被操作系统从等待队列中唤醒。

    互斥锁对资源访问进行把控。进入临界区需要获得锁,此时该线程拥有了对资源消耗的权力,也就是对共享数据修改的权力。退出临界区需要释放锁,将锁释放掉给其它线程继续执行。

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-17 16:30:49

    简单的说,不会。Mutex是一种锁,它只是保证同时有一个线程可以锁住它,但是全局变量怎么控制是你自己代码实现的。也就是一种约定,如果另外一个线程不去先试图锁定Mutex,而是直接去修改那些全局变量,是不会被阻止的。

    回复
    0
  • 取消回复发送