c++多線程(二)互斥量

一、簡介

互斥量是一種同步原語,是一種線程同步的手段,用來保護多線程同時訪問的共享數據.

  • std::mutex: 獨佔的互斥量,不能遞歸使用.

  • std::timed_mutex: 帶超時的獨佔互斥量,不能遞歸使用.

  • std::recursive_mutex: 遞歸互斥量,不帶超時功能.

  • std::recursive_timed_mutex: 帶超時的遞歸互斥量.

這些互斥量的基本接口十分相近,都是通過lock()來阻塞線程,直到獲得互斥量的所有權爲止.在線程或的互斥量並完成任務後,就必須使用unlock()來解除對互斥量的佔用,lock和unlock必須成對出現.try_lock()嘗試鎖定互斥量,成功返回true,失敗返回false,他是非阻塞的.

二、示例

示例包括:
1、使用lock加鎖和unlock解鎖
2、使用lock_guard:用到了RAII的技術,這種技術在類的構造函數中分配資源,在析構函數中釋放資源,保證資源在出了作用域之後就釋放。

#include "stdafx.h"

static std::mutex g_lock;

void lock_unlock()
{
    //上鎖
    g_lock.lock();
    cout << "in id: " << this_thread::get_id() << endl;
    this_thread::sleep_for(chrono::seconds(1));
    cout << "out id: " << this_thread::get_id() << endl;
    //解鎖
    g_lock.unlock();
}

void f_lock_guard()
{
    //lock_guard在構造時會自動鎖定互斥量,而在退出作用域後進行析構時就會自動解鎖.
    lock_guard<std::mutex> lock(g_lock);
    cout << "in id: " << this_thread::get_id() << endl;
    this_thread::sleep_for(chrono::seconds(1));
    cout << "out id: " << this_thread::get_id() << endl;
}

int mutex_demo()
{
    std::thread t1(lock_unlock);
    std::thread t2(lock_unlock);
    std::thread t3(lock_unlock);

    t1.join();
    t2.join();
    t3.join();

    std::thread t4(f_lock_guard);
    std::thread t5(f_lock_guard);
    std::thread t6(f_lock_guard);

    t4.join();
    t5.join();
    t6.join();

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