一、互斥量
互斥量或者互斥鎖(Mutex)是一種實現線程間對資源互斥訪問的機制。操作互斥鎖的時間和空間開銷相對比較低,因而常用於高頻使用的關鍵共享數據和程序段。互斥鎖有兩種狀態,開鎖(unlock)和關鎖(lock)。我們就是通過這種線程同步手段在多線程編程中來防止多個線程同時操作共享資源。一旦線程鎖住了互斥量,那麼其他線程就必須等待它解鎖互斥量才能再訪問共享資源。
推薦閱讀:
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm
C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm
二、C++11中的Mutex
2.1Mutex類
頭文件<Mutex>中定義了四種互斥量類,他們是:
mutex 基本Mutex recursive_mutex 遞歸Mutex
time_mutex 定時Mutex recursive_timed_mutex 定時遞歸Mutex
2.2Lock類
lock_guard 方便線程對互斥量上鎖
unique_lock 方便線程對互斥量上鎖,並提供更好的上鎖解鎖控制
--------------------------------------------------
三、Mutex用法
mutex 是 最基本的互斥量,提供了獨占所有權的特。它的成員函數和用法如下:
1.構造函數:互斥量不可拷貝不可移動,最初產生的mutex對象是unlock狀態。、
2.lock():調用線程,將互斥量對象鎖定。該函數的調用有如下3種情況:
a.如果互斥量當前未被鎖定,調用線程將該互斥量鎖住,直到調用 unlock之前,線程一直擁有該鎖。
b. 如果當前互斥量被其他線程鎖住,則當前的調用線程被阻塞住。
c. 如果當前互斥量被當前調用線程鎖住,則會產生死鎖.
3.unlock():解鎖,釋放當前線程對互斥量的所有權。
4.try_lock():嘗試鎖住互斥量,如果互斥量被其他線程占有,則當前線程也不會被阻塞,鎖定成功返回true,鎖定失敗返回false,是非阻塞的。
一個簡單的例子如下:
#include<iostream>
#include<thread>
#include<mutex>
//臨界資源,我們模擬用多個線程去操作該資源
volatile int counter(0);
//創建一個互斥量,用於訪問約束各線程訪問臨界資源
std::mutex mtx;
void CounterIncreases()
{
for (size_t i = 0; i < 100; ++i)
{
if (mtx.try_lock())//當前線程嘗試鎖定互斥量,鎖定成功則將counter加1後解鎖,供其它線程去訪問資源
{
++counter;
mtx.unlock();
}
}
}
int main()
{
std::thread thread_tasks[10];
for (auto& task : thread_tasks)
{
task = std::thread(CounterIncreases);
task.join();
}
std::cout << counter << " successful increases of the counter" << std::endl;
return 0;
}