首頁  >  問答  >  主體

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

PHP中文网PHP中文网2743 天前834

全部回覆(3)我來回復

  • 巴扎黑

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

    鎖的範圍取決於你的lock的作用域,那麼在你這個測試程式中就是鎖住了main作用域了。
    當然你這個範例程式本身是沒有意義的哈,因為不是用在多執行緒下。假設是多執行緒吧,這時別的執行緒在嘗試鎖mutex時就需要等你這裡的mutex鎖釋放,也就是說某一時刻只有一個執行緒能存取變數a和c。

    回覆
    0
  • PHPz

    PHPz2017-04-17 16:30:49

    加鎖以後,互斥鎖就被保持住,除非當前線程釋放,當前線程在獲得鎖的時候就已經執行完這一行程式碼,進入了下一行執行,因此它有釋放互斥鎖的資格。而等待該鎖定的其它執行緒在鎖定釋放前都會沉睡在這一行程式碼,直到被作業系統從等待佇列中喚醒。

    互斥鎖對資源存取進行把控。進入臨界區需要取得鎖,此時該執行緒擁有了對資源消耗的權力,也就是對共享資料修改的權力。退出臨界區需要釋放鎖,將鎖釋放掉給其它執行緒繼續執行。

    回覆
    0
  • 巴扎黑

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

    簡單的說,不會。 Mutex是一種鎖,它只是保證同時有一個執行緒可以鎖住它,但是全域變數怎麼控制是你自己程式碼實現的。也就是一種約定,如果另外一個執行緒不去先試圖鎖定Mutex,而是直接去修改那些全域變量,是不會被阻止的。

    回覆
    0
  • 取消回覆