对多线程中互斥锁的一些理解

互斥锁 

1.mutex 互斥锁,用于保护共享资源,一般来说每个共享变量对应一个mutex互斥锁,其中包含三个方法:

            (1)lock,锁定资源,如果资源已被其他线程锁定,则当前线程阻塞;

            (2)unlock,解锁资源,解锁后,该资源可以被其他线程锁定;

            (3)try_lock,尝试锁定资源,如果资源已被锁定,则返回false,线程不会阻塞;

#include <iostream>
#include <mutex>
#include <thread>

using namespace std;

// 创建一个互斥锁
mutex mtx;

// 定义一个共享资源
int shared_resource = 0;

// 定义两个线程,分别对共享资源进行加锁和解锁
void increment_shared_resource() {
  // 获取锁变量
  mtx.lock();

  // 对共享资源进行加锁
  shared_resource++;

  // 释放锁变量
  mtx.unlock();
}

void decrement_shared_resource() {
  // 获取锁变量
  mtx.lock();

  // 对共享资源进行解锁
  shared_resource--;

  // 释放锁变量
  mtx.unlock();
}

// 创建两个线程
thread t1(increment_shared_resource);
thread t2(decrement_shared_resource);

// 启动两个线程
t1.join();
t2.join();

// 打印共享资源的值
cout << shared_resource << endl;

2.lock_guard:是一种RAII(资源获取即初始化)类,用于在C++中管理互斥锁。lock_guard在构造时获取互斥锁,并在析构时释放互斥锁。这确保了互斥锁在使用后始终被释放,即使在发生异常的情况下也是如此。

#include <mutex>
#include <iostream>

using namespace std;

int main() {
  mutex mtx;

  {
    // 创建一个lock_guard对象,并获取互斥锁
    lock_guard<mutex> lock(mtx);

    // 对共享资源进行操作
    cout << "共享资源被访问" << endl;
  }

  // 析构lock_guard对象,并释放互斥锁
  return 0;
}

3.unique_lock:可以理解为加强版的lock_guard,但是其可以手动加锁解锁,可以控制其是否创建即加锁,其构造函数根据传入参数不同可以分为如下几种:

(1)std::adopt_lock这通常用于在同一线程中的不同作用域内对互斥量进行多次加锁,并确保在作用域结束时正确解锁;使用 std::adopt_lock 参数时,需要保证在创建unique_lock对象之前,已经手动锁定了相应的互斥量;

(2)std::defer_lock:这通常用于在创建unique_lock时,并不直接锁住资源,而是需要在后续的流程里面手动去上锁,但是在上锁之后,无需手动释放,在其作用域结束时,会自动释放锁;

(3)std::try_to_lock:这和mutex中的try_lock方法作用类似,就是在创建unique_lock时,判断资源是否已经被锁住,如果已经被锁,那就返回false,并不阻塞当前线程,如果没被锁住,则成功锁住该资源;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值