C++多线程加锁详解(易于理解)

参考:C++多线程基础教程
c++11多线程之使用std::try_to_lock摸鱼

#include < mutex >
mutex m; // 实例化对象m

  1. m.lock(); // 不推荐这么做,如果忘记unlock会锁死。
    m.unlock(); // 使用lock_guard or unique_lock避免该问题
  2. lock_guard gl(m,参数); // 出了{}作用域自动解锁。(参数可以为空自动锁)
  3. unique_lock gl(m,参数);
lock_guard unique_lock
手动lock与手动unlock 不支持 支持
参数 支持adopt_lock 支持adopt_lock/try_to_lock/defer_lock

参数:

  1. adopt_lock: 申请锁为该成员函数维护,但不会锁,需要先手动m.lock();但会自动释放。
  2. try_to_lock: 尝试去锁定,得保证处于unlock的状态,然后尝试现在能不能锁;尝试用mutx的lock()去锁定这个mutx,但没有锁定成功会立即返回不会阻塞在那。
  3. defer_lock: 初始化了一个没有加锁的mutex,所以需要手动加锁,unique_lock gl(m,defer_lock); gl.lock(); 会自动解锁。也可以 gl.unlock(); 临时解锁, gl.lock(); 再上锁。

最常用的锁代码示例:

#include
#include
#include
using namespace std;
mutex m;//实例化m对象,不要理解为定义变量
void proc1(int a)
{
    lock_guard<mutex> g1(m);//用此语句替换了m.lock();lock_guard传入一个参数时,该参数为互斥量,此时调用了lock_guard的构造函数,申请锁定m
    cout << "proc1函数正在改写a" << endl;
    cout << "原始a为" << a << endl;
    cout << "现在a为" << a + 2 << endl;
}//此时不需要写m.unlock(),g1出了作用域被释放,自动调用析构函数,于是m被解锁

void proc2(int a)
{
    {
        lock_guard<mutex> g2(m);
        cout << "proc2函数正在改写a" << endl;
        cout << "原始a为" << a << endl;
        cout << "现在a为" << a + 1 << endl;
    }//通过使用{}来调整作用域范围,可使得m在合适的地方被解锁
    cout << "作用域外的内容3" << endl;
    cout << "作用域外的内容4" << endl;
    cout << "作用域外的内容5" << endl;
}
int main()
{
    int a = 0;
    thread proc1(proc1, a);
    thread proc2(proc2, a);
    proc1.join();
    proc2.join();
    return 0;
}

你可能感兴趣的:(C/C++/qt,c++)