以示例方式記錄mutex

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章