首页 > 编程语言 >C++学习随笔——lock_guard和mutex的使用方法

C++学习随笔——lock_guard和mutex的使用方法

时间:2024-08-28 14:48:53浏览次数:10  
标签:std mtx lock C++ 互斥 guard include

std::mutexstd::lock_guard 是 C++ 标准库中用于多线程同步的工具,主要用于防止多个线程同时访问共享资源,导致数据竞争问题。

 

std::mutex 是一个用于互斥锁的类,提供了锁定(lock)和解锁(unlock)的功能。

使用方法:

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

std::mutex mtx;

void printMessage(const std::string& message) {
    mtx.lock();    // 锁定互斥量
    std::cout << message << std::endl;
    mtx.unlock();  // 解锁互斥量
}

int main() {
    std::thread t1(printMessage, "Hello from thread 1");
    std::thread t2(printMessage, "Hello from thread 2");

    t1.join();
    t2.join();
    return 0;
}

解释:

  • mtx.lock():锁定互斥量,使得其他线程在这段代码执行期间无法获得锁。
  • mtx.unlock():解锁互斥量,允许其他线程获取锁。

注意,如果 lock()unlock() 之间的代码抛出了异常,unlock() 可能不会被调用,从而导致死锁。因此,推荐使用 std::lock_guard 进行更安全的锁管理。

===============================================================================================================================

 

std::lock_guard 是一个 RAII(Resource Acquisition Is Initialization)类,自动管理互斥量的锁定和解锁,确保在作用域结束时(无论是正常结束还是异常退出)互斥量被正确解锁

使用方法:

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

std::mutex mtx;

void printMessage(const std::string& message) {
    std::lock_guard<std::mutex> lock(mtx); // 自动锁定
    std::cout << message << std::endl;
    // 作用域结束时,lock_guard 自动解锁互斥量
}

int main() {
    std::thread t1(printMessage, "Hello from thread 1");
    std::thread t2(printMessage, "Hello from thread 2");

    t1.join();
    t2.join();
    return 0;
}

解释:

  • std::lock_guard<std::mutex> lock(mtx);:创建一个 std::lock_guard 对象 lock,并传入互斥量 mtx
  • 在创建 lock 对象时,互斥量 mtx 被锁定,当 lock 对象被销毁时(例如当函数退出或异常抛出时),互斥量自动解锁。

使用 std::lock_guard 的优点:

  • 自动管理锁定和解锁,避免因异常或提前返回导致的死锁。
  • 简洁的语法,更容易编写正确的并发代码。

 

标签:std,mtx,lock,C++,互斥,guard,include
From: https://www.cnblogs.com/kitanoki/p/18384640

相关文章

  • C++中常用宏
    C++中会常使用到宏来进行条件编译,或设置变量1、__cplusplus:区分当前代码为C++或C//定义只在C++中才进行extern"C"的操作#ifdef__cplusplusextern"C"{#endifvoidfun(inta,intb);#ifdef__cplusplus}#endif2、区分操作系统:_WIN32:Windows操作系统,不区......
  • c++算法3-广度优先搜索算法dfs
    搜索算法众所周知,搜索算法分为常见的两种深度优先搜索算法(dfs)广度优先搜索算法(bfs)深度优先搜索算法深度优先搜索算法就是一条道走到黑,如迷宫问题,重复不断地向前探索如果碰到死胡同就说明前面已经没有路了,这时候就可以想其他方向搜索,最终走到终点。回溯回溯是一种搜索算法......
  • 适用于多语言的VScode配置教程:同一文件夹内支持C++, JAVA, Python
    前言VScode作为一款强大的文本编辑器,只要配置恰当,便可以同时在一个环境内编译多种语言的文件。本文简要给出一种同时支持C++,Python,Java的配置方式(windows平台)。配置格式1.创建工作区并建立如图的文件夹及文件结构其中包括vscode的配置文件夹.vscode,以及其他三个代码文件......
  • C++学习随笔——算法题:全排列问题
    算法题:输入一个不存在重复字符的字符串,打印出字符串中字符的全部排列组合。代码实现:#include<iostream>#include<string>#include<vector>#include<algorithm>//std::swapvoidpermute(std::stringstr,intleft,intright){if(left==right){st......
  • C++学习随笔——C++STL中binary_search的使用方法
    std::binary_search是C++标准模板库(STL)中的一个算法,用于在有序范围内查找某个值是否存在。它基于二分查找算法,时间复杂度为O(logn)。std::binary_search的基本用法:  boolbinary_search(ForwardIteratorfirst,ForwardIteratorlast,constT&value);first:指......
  • C++学习随笔——什么是迭代器
    迭代器是C++标准模板库(STL)中用于遍历容器元素的对象或概念。它们提供了一种通用的方式来访问容器中的元素,而不需要了解容器的底层实现。迭代器在设计上类似于指针,但功能更为强大和灵活。 1.迭代器是什么?迭代器是一个抽象概念,它为容器(如vector、list等)提供了一种统......
  • QT/C++中的GDAL多线程应用(读取):发生的问题以及解决方案
    1.引言在使用GDAL库对TIF文件进行切割和创建瓦片金字塔时,为了提高创建效率,不得不考虑使用多线程处理。然而,在实际实现过程中,我遇到了许多问题。通过不断的尝试和优化,最终找到了有效的解决方案。本文将详细记录这一过程中的问题和解决方法。2.初始多线程尝试与问题2.1......
  • VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS Dell (戴尔) 定制版
    VMwareESXi8.0U3macOSUnlocker&OEMBIOSDell(戴尔)定制版ESXi8.0U3标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)、Huawei(华为)、xFusion(超聚变)OEM定制版请访问原文链接:h......
  • 南沙C++陈老师讲题:1078:求分数序列和
    ​【题目描述】【输入】输入有一行,包含一个正整数n(n≤30)n(n≤30)。【输出】输出有一行,包含一个浮点数,表示分数序列前nn项的和,精确到小数点后44位。【输入样例】2【输出样例】3.5000#include<iostream>#include<stdio.h>usingnamespacestd;intmain()......
  • 多线程四-Lock锁及其原理分析
    JUC是什么可能有些不太关注底层代码,会不太理解juc是啥,比如之前的我,只知道是跟并发相关。juc其实就是并发包路径的缩写,java.util.concurrent.而Lock是其中锁的接口,有比如重入锁,读锁,写锁等一些具体实现。这部分源码理解起来还是有些难度,暂时先理解其大概思路,对于实现有一个印象,比......