#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
/*
* @desc std::mutex
* @constructor
* constexpr mutex() noexcept; // 只有一個默認構造函數
* mutex (const mutex&) = delete; // 禁止拷貝構造
* @function
* mutext互斥量,爲線程提供基本的互斥和同步工具,有效的保護多線程之間共享數據的數據安全。
* @method
* 1、mutext.lock():獲取mutext鎖,針對不同的場景會出現下面三種情況
* (1) 若該互斥量沒有被鎖住,則調用線程將該互斥量鎖住,直到調用unlock之前,該線程一直擁有鎖。
* (2) 若該互斥量被其他線程鎖住,則當前的調用線程被阻塞
* (3) 若該互斥量被當前線程鎖住,則產生死鎖(deallock)
* 2、mutext.try_lock():嘗試獲取mutex鎖,針對不同場景會出現下面三種情況
* (1) 該互斥量沒有被鎖住,則調用線程將該互斥量鎖住,直到調用unlock之前,該線程一直擁有鎖。【與lock相同】
* (2) 該互斥量被其他線程鎖住,嘗試lock失敗,返回false,不阻塞【與lock有區別】
* (3) 高互斥量被當前線程鎖住,則產生死鎖(deallock)
* 3、mutext.unlock():對mutex進行解鎖,釋放當前線程對mutex的所有權。
* @other
* std::recursive_mutex
* 支持遞歸的互斥量對象,允許同一個線程內對mutex進行多次上鎖(即遞歸上鎖),來獲得互斥量對象的
* 多層所有權。注意:lock和unlock的調用必須一一對應,即調用次數相同。
*/
std::mutex g_mtx;
int count;
void ThreadWork() {
// 若當前mutex被其他線程鎖住,則lock()阻塞
// g_mtx.lock();
// 若被鎖住,則try_lock()不阻塞返回false
while (!g_mtx.try_lock()) continue;
for (int i = 0; i < 10000; i++)
count++;
g_mtx.unlock();
}
int main() {
std::vector<std::thread> threadVec;
for (int i = 0; i < 10; i++) {
threadVec.emplace_back(ThreadWork);
}
for (auto& th : threadVec) {
th.join();
}
std::cout << count << std::endl;
}
以示例方式記錄mutex
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.