当前位置: 首页 > news >正文

C++11互斥锁的使用

是C++11标准库中用于多线程同步的库,提供互斥锁(mutex)及其相关函数。

以下是一些基本的使用示例:

1.创建和销毁互斥锁

#include <mutex>std::mutex mtx;

2.加锁

std::lock_guard<std::mutex> lock(mtx);  // 加锁
// 或者
mtx.lock();  // 加锁

3.解锁

mtx.unlock();  // 解锁

4.尝试加锁

if(mtx.try_lock()) {// 成功加锁
} else {// 加锁失败
}

5.在条件变量中使用互斥锁

条件变量(<condition_variable>)常常与互斥锁一起使用,用于等待某个条件成立。

#include <condition_variable>
#include <mutex>
#include <thread>
#include <chrono>
#include <iostream>std::mutex mtx;             // 全局互斥锁.
std::condition_variable cv; // 全局条件变量.
bool ready = false;         // 全局状态变量.void print_id(int id)
{std::unique_lock<std::mutex> lock(mtx); // 加锁.while (!ready){                                     // 如果还没就绪就等待...cv.wait(lock);                    // 在此锁上等待条件变量的通知.}                                     // 继续执行...std::cout << "thread " << id << '\n'; // 打印线程id.
} // 释放锁.void go()
{                                           // 在主线程中调用这个函数来启动所有线程的运行.std::unique_lock<std::mutex> lock(mtx); // 加锁.ready = true;                           // 设置全局状态为就绪.cv.notify_all();                        // 通知所有在等待的线程.
} // 释放锁.int main()
{                            // 主线程函数.std::thread threads[10]; // 创建10个线程的线程数组.for (int i = 0; i < 10; ++i){                                             // 对每个线程进行以下操作:threads[i] = std::thread(print_id, i);    // 创建新线程并指定函数和参数.}                                             // 主线程继续执行其他操作...std::cout << "10 threads ready to race...\n"; // 输出消息表明所有线程已准备好竞争运行.go();                                         // 设置全局状态为就绪并通知所有等待的线程.for (int i = 0; i < 10; ++i){threads[i].join();}return 0;
}

注:
go()方法中如果有一个线程首先开始打印, 则其他线程会立即开始打印, 因为它们在cv上等待时被阻塞了,所以它们会立即得到cv的信号并退出等待状态. 所有线程都打印完后,会释放mtx并使cv通知其他线程的线程调度的线程调度函数中的任务完成. 这个函数就会立即返回,其他任务也就会立即执行, 这样它们就能抢在其他线程之前开始执行了, 因为它们已经在"起跑线"上了!这是一种非常常见的模式, 特别是在并发编程中, 当我们希望所有线程/进程尽快开始执行任务时.这种模式被称为"起跑信号". 在这种情况下, 如果有多个线程同时打印, 则它们的输出可能是交错的,因为它们是并发执行的, 所以它们的执行顺序是不确定的.

6.使用多个互斥锁

你可以使用多个互斥锁以实现更细粒度的同步。例如,你可能有一个用于保护访问共享资源的互斥锁,同时还有一个用于保护访问其他特定资源的互斥锁。

std::mutex mutex1;
std::mutex mutex2;// 使用两个互斥锁
std::lock_guard<std::mutex> lock1(mutex1);
std::lock_guard<std::mutex> lock2(mutex2);// 对共享资源进行操作
// ...// 对其他特定资源进行操作
// ...

7.自定义互斥锁

C++11允许你实现自定义的互斥锁。这可能对于特殊情况下,标准库提供的互斥锁不适用的情况。自定义互斥锁可以让你更深入地控制线程同步的行为。

class CustomMutex {
public:void lock() {// 实现自定义加锁逻辑}void unlock() {// 实现自定义解锁逻辑}
};// 使用自定义互斥锁
CustomMutex mutex;
std::lock_guard<CustomMutex> lock(mutex);

8.避免死锁

使用互斥锁时,要特别注意避免死锁。死锁是指两个或更多的线程相互等待对方释放资源,导致所有线程都无法继续执行的情况。你应该总是确保在可能的情况下按正确的顺序获取锁。

9.使用std::lock()来同时锁定多个互斥锁

C++11标准库提供了std::lock()函数,可以同时锁定多个互斥锁,以避免死锁。这个函数会以不确定的顺序锁定传入的互斥锁。这样,你可以一次性锁定所有需要的互斥锁,而不是逐个锁定,以增加代码的清晰性。

std::mutex mutex1;
std::mutex mutex2;
std::lock(mutex1, mutex2);  // 同时锁定两个互斥锁

相关文章:

C++11互斥锁的使用

是C11标准库中用于多线程同步的库&#xff0c;提供互斥锁(mutex)及其相关函数。 以下是一些基本的使用示例&#xff1a; 1.创建和销毁互斥锁 #include <mutex>std::mutex mtx;2.加锁 std::lock_guard<std::mutex> lock(mtx); // 加锁 // 或者 mtx.lock(); //…...

unity 桌面程序

using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; public class chuantou : MonoBehaviour { [DllImport(“user32.dll”)] public static extern int MessageBox(IntPtr hwnd,string t…...

echarts统一纵坐标y轴的刻度线,刻度线对齐。

要求&#xff1a; 纵坐标刻度线对齐&#xff1b;刻度间隔为5&#xff1b;去掉千位默认的逗号&#xff1b;刻度最小是0. 效果图&#xff1a; 代码&#xff1a; yAxis: [{type: "value",position: "left",name: "kW",offset: 100,nameTextStyle:…...

一个数据库版本兼容问题

mysql旧的版本号是&#xff1a;5.3.10 本机版本号是&#xff1a;8.0.22 报错&#xff1a;“com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create” 1.程序里做兼容&#xff1a; <dependency><groupId>mysql</groupId>…...

学习Nano编辑器:入门指南、安装步骤、基本操作和高级功能

文章目录 使用Nano编辑器入门指南引言1.1 关于Nano编辑器1.2 Nano的起源和特点 安装Nano2.1 在Debian/Ubuntu系统上安装Nano2.2 在CentOS/RHEL系统上安装Nano2.3 在其他Linux发行版上安装Nano 启动Nano3.1 命令行启动Nano3.2 打开文件 Nano的基本操作4.1 光标移动和选择文本4.2…...

在北京多有钱能称为富

背景 首先声明&#xff0c;此讨论仅限个人的观点&#xff0c;因为我本身不富嘛&#xff0c;所以想法应该非常局限。 举个栗子 富二代问我朋友&#xff0c;100~1000w之间&#xff0c;推荐一款车&#xff1f; 一开始听到这个问题的时候&#xff0c;有被唬住&#xff0c;觉得预…...

Chrome扩展程序开发随记

在Chrome浏览器向正被浏览的外网网页植入自定义JS脚本 为了实现如标题的目的&#xff0c;需要开发一个Chrome扩展程序。接下来内容是实现简要步骤&#xff1a; 一、新建文件夹&#xff0c;命名为项目名&#xff0c;如“MyPlugin”。 二、进入文件夹内&#xff0c;新建名为“…...

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行&#xff1a; npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript&#xff0c;Vue和React是常用前端框架&#xff0c;可以根据自己的需要进行选择 通过上下键进行选择&#xff0c;按下回车进行确认 创建…...

int *a, int **a, int a[], int *a[]的区别

int *a; ---定义一个指向整型变量的指针a int **a; ---定义一个指向整型变量指针的指针a int a[]; ---定义一个整型变量数组a int *a[]; ---定义一个指向整型变量指针的数组a...

leetcode100----双指针

283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1:输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2:输入: nums …...

ORM基本操作

ORM基本操作 基本操作包括增删改查操作&#xff0c;即(CRUD操作) CRUD是指在做计算处理时的增加(Create)、读取查询(Read)、更新Update)和删除(Delete) ORM CRUD 核心-> 模型类管理器对象 每个继承自 models.Model 的模型类&#xff0c;都会有一个 objects 对象被同样继…...

c语言进阶部分详解(指针进阶2)

大家好&#xff01;我快马加鞭接着写出指针部分part2部分。第一部分见&#xff1a;c语言进阶部分详解&#xff08;指针进阶1&#xff09;_总之就是非常唔姆的博客-CSDN博客 指针初阶部分见&#xff1a;c语言进阶部分详解&#xff08;指针初阶&#xff09;_总之就是非常唔姆的博…...

Java基础(一)——Hello World,8种数据类型,键盘录入

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

JAVA学习笔记(IF判断结构)

/*** 学习JAVA单分支结构* 掷骰子游戏* 1.如果三个随机数的和大于15&#xff0c;则手气不错&#xff1b;* 2.如果三个随机数的和在10-15之间&#xff0c;手气一般&#xff1b;* 3.如果三个随机数的和1在0以下&#xff0c;手气不太好。*/public class TestIf01 {public static v…...

【跟小嘉学 PHP 程序设计】二、PHP 基本语法

系列文章目录 【跟小嘉学 PHP 程序设计】一、PHP 开发环境搭建 【跟小嘉学 PHP 程序设计】二、PHP 基本语法 文章目录 系列文章目录@[TOC](文章目录)前言一、PHP基本语法1.1、hello,world1.2、PHP语法的其他形式1.2.1、简短形式(了解即可)1.2.2、Script 风格1.2.3、ASP 风格1…...

面试总结之微服务篇

一、概览 1、微服务常用组件 微服务给系统开发带来了诸多问题和挑战&#xff0c;如服务间通信和调用的复杂性、数据一致性和事务管理、服务治理和版本管理等&#xff0c;为解决应对这些问题和挑战&#xff0c;各种微服务组件应运而生微服务的常见组件和实现&#xff1a; 1…...

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …...

新版kafka可视化界面组件

二、安装kafka可视化客户端工具&#xff08;kafka tool 2&#xff09; 1、下载安装 在官网中找到对应自己电脑系统的版本&#xff1a; kafka Tool2官网下载地址&#xff1a; Offset Explorer 这个方案是为Kafka依赖zookeeper提供的可视化解决方案。 前言 在早期使用kafka的…...

​P1102 A-B 数对 【双指针(尺取法)】​

P1102 A-B 数对 【双指针&#xff08;尺取法&#xff09;】 题目描述 给出一串正整数数列以及一个正整数 C&#xff0c;要求计算出所有满足 A−BC 的数对的个数&#xff08;不同位置的数字一样的数对算不同的数对&#xff09;。 输入格式 输入共两行。 第一行&#xff0c;两个…...

Flutter绘制拖尾效果

演示&#xff1a; 代码&#xff1a; import dart:ui;import package:flutter/material.dart; import package:kq_flutter_widgets/widgets/chart/ex/extension.dart;class TrailingView extends StatelessWidget {const TrailingView({super.key});overrideWidget build(Build…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...