#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,而是直接去修改那些全域變量,是不會被阻止的。