C++多线程学习(十二、特殊的原子类型atomic_flag,自旋锁)

news2024/9/23 19:20:43

目录

atomic_flag

自旋锁

自旋锁与互斥锁的不同

 1. 等待方式不同:

2. 资源消耗不同:

3. 适用场景不同:

简单案例


其他的原子类型是可以通过is_lock_free()来判定是否无锁

atomic_flag

atomic_flag:是无锁的

atomic_flag的内部包含两个函数:

1.test_and_set():如果没有被设置,就设置,如果设置了则返回true.

2.clear():清除标记,让下一次调用test_and_set()返回false.

自旋锁

自旋锁与互斥锁的不同

一样的例子,互斥锁是A上厕所,B在门口等。

而自旋锁则是A在上厕所,B仍然在做自己的事情,直到A上完厕所出来,B直接去上。

 1. 等待方式不同:


        自旋锁:当线程请求自旋锁时,如果锁已被其他线程占用,请求线程将以忙等方式自旋等待,即反复检查锁是否可用,直到获取到锁为止。
        互斥锁:当线程请求互斥锁时,如果锁已被其他线程占用,请求线程将进入阻塞状态,直到获取到锁后才会被唤醒继续执行。



2. 资源消耗不同:


        自旋锁:自旋等待期间,请求线程将一直占用CPU资源,如果自旋等待时间过长,会导致CPU资源的浪费。
        互斥锁:阻塞等待期间,请求线程并不占用CPU资源,线程被唤醒后再竞争锁。



3. 适用场景不同:


        自旋锁:适用于保护临界区很小且锁的竞争很短暂的情况,因为自旋等待消耗的是CPU资源。
        互斥锁:适用于保护临界区很大且锁的竞争很激烈的情况,因为阻塞等待不会占用CPU资源。

简单案例

#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
//初始化:也可以用atomic_flag lock = {};
atomic_flag lock = ATOMIC_FLAG_INIT;//ATOMIC_FLAG_INIT这个宏定义是大括号:{}

void test1(int n)
{
	while (lock.test_and_set())//可以不传参,有重载的枚举类型【之前讲过】
	{
		printf("等待中...%d\n", n);
	}
	printf("线程完成...%d\n", n);
}
void test2(int n)
{
	printf("线程启动:%d\n",n);
	this_thread::sleep_for(1s);
	lock.clear();
	printf("线程运行结束:%d\n", n);
}
int main()
{
	lock.test_and_set();
	thread t1(test1, 1);
	thread t2(test2, 2);
	t1.join();
	t2.join();


	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

25岁的我被辞了转行做软件测试,5个月靠体系化自学“跳进”阿里

前言 大学学的是物流管理&#xff0c;毕业之后到现在的两年时间内也是做的物流相关的岗位&#xff0c;但是现在想做个有技术含量的工作&#xff0c;所以想学软件测试&#xff0c;大学的时候学过VB&#xff0c;前几天自己网上看了讲软件测试入门的视频觉得还能听懂所以我说一下…

Kubernetes_KubeProxy_Service找到Pod与DNS解析Service/Pod

文章目录 前言一、Service找到Pod(Iptables)二、Service找到Pod(IPVS)2.1 IPVS模式原理2.2 IPVS模式实践修改为 IPVS 模式 之前修改为 IPVS 模式之中修改为 IPVS 模式之后 三、Service和Pod的DNS域名尾声 前言 一、Service找到Pod(Iptables) 在前面的文章中&#xff0c;我们已…

【动态规划算法】第十题:174.地下城游戏

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你…

Java中如何定义一个线程工厂?

线程工厂官方文档&#xff1a; 在Java中&#xff0c;可以通过实现ThreadFactory接口来定义一个线程工厂。线程工厂用于创建新的线程对象&#xff0c;并可以自定义线程的属性、命名规则等。 下面是一个简单的示例代码&#xff0c;展示如何定义一个线程工厂&#xff1a; import…

路径规划算法:基于学校优化优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于学校优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于学校优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

抖音账号矩阵系统|源码|开源代码独立部署难度-开发者分享

抖音账号矩阵系统&#xff0c;短视频账号矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员…

学生信息管理系统——C语言版

C语言版学生信息管理系统 一&#xff0c;开发环境 操作系统&#xff1a;windows10, windows11, linux, mac等。开发工具&#xff1a;Qt, vscode, visual studio等开发语言&#xff1a;c语言 二&#xff0c;功能需求 用户界面: 提供一个简洁的文本界面&#xff0c;用户可以通…

EA编写的十大注意事项:避免常见的错误和陷阱

EA编写是一项复杂而有挑战性的任务&#xff0c;需要投资者具备一定的编程技能及丰富的交易经验。下面我将分享EA编写过程中的十大注意事项&#xff0c;以及如何避免常见的错误和陷阱。 设定明确的目标和策略 在编写EA之前&#xff0c;一定要明确交易目标和策略。这包括交易工具…

从OVF矢量场文件中获取磁斯格明子的位置和半径的粗略方法(trace skyrmion)

文章目录 前言一、使用oommf的avf2odt命令行程序获取斯格明子中心位置的示例二、当磁体系的单个xy平面层仅有一个斯格明子的情况1.读取所有磁化文件中的指定磁化分量2.筛选出每一个xy平面层中位于磁化分量阈值范围内的单元格3.计算组成磁结构的所有单元格的平均坐标和平均距离 …

今年想考CISP,速看这篇

关键词&#xff1a;CISP考试&#xff0c;CISP认证&#xff0c;CISP报名条件&#xff0c;CISP培训&#xff0c;CISP考试费用&#xff0c;CISP考试大纲 注册信息安全专业人员&#xff08;Certified Information Security Professional&#xff0c;简称“CISP"&#xff09;&…

如何处理Long类型精度丢失问题?

如何处理Long类型精度丢失问题?_拒绝画大饼的博客-CSDN博客 解决问题&#xff1a;long型数据精度丢失_long精度丢失_YOLO小蜗的博客-CSDN博客 原因分析 通过观察控制台输出的SQL发现页面传递过来的员工id的值和数据库中的id值不一致&#xff0c;这是怎么回事呢&#xff1f; 在…

Node中的模块引擎EJS模块渲染

1.导入 const ejsrequire("ejs") 2.声明数组 const group["张三","李四","王二","麻子"] 3.EJS实现 let resultejs.render(<ul> <% group.forEach(item>{ %> <li><%item%></li> <% }) …

ionic实现滑动的三种方式

ionic实现滑动的三种方式 在移动端受屏幕大小所限&#xff0c;展示内容很多的时候&#xff0c;就要使部分区域进行滑动。本文展示项目中所有到的几种方式&#xff0c;大家可以看自己的需求选择合适的滑动方式。实现滑动的基本原理&#xff0c;有两个容器A、B,假如A在外层&#…

[element-ui] el-descriptions站位,换行用法

使用element-ui组件el-descriptions element-ui组件el-descriptions官方文档 需要将el-descriptions-item换行用法&#xff1a;使用span &#xff08;1&#xff09;span 代表占位&#xff0c;当span 的值大于 column的值&#xff0c;就会自动换一行 &#xff08;2&#xff0…

通过正则表达式删除包含某个字符串的一整行

正则表达式为&#xff1a;^.*YourString.*\R 以下为NotePad编辑器的操作步骤&#xff1a; 1、CtrlH打开文本编辑器的替换功能 2、将上面的正则表达式复制到"查找目标"文本框 3、"替换为"文本框置为空 4、勾选“正则表达式” 5、点击替换或者全部替换

数据结构-ArrayList

目录 线性表 顺序表 ArrayList ArrayList的使用 ArrayList的构造方法 ArrayList的常用方法 ArrayList的遍历 实现简单的ArrayList 洗牌算法 删除公共字符串问题 杨辉三角 线性表 线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结…

【标准】国家标准GB7713-87(科学论文编写格式)

目 录 1 引言 2 定义 2.1 科学技术报告 2.2 学位论文 2.3 学术论文 3 编写要求 4 编写格式 5 前置部分 5.1 封面 5.2 封二 5.3 题名页 5.4 变异本 5.5 题名 5.6 序或前言 5.7 摘要 5.8 关键词 5.9 目次页 6 主体部分 6.1 格式 6.2 序号 6.3 引言(或绪论)…

如何在没有软件的情况下将 PDF 转换为 PPT(100% 免费)

演示文稿由文字、图片、音频、动画等元素组成&#xff0c;通常用于会议、课堂或演讲中&#xff0c;展示演讲者想要表达的主要内容。如果您遇到重要文档以 PDF 格式存储&#xff0c;但现在需要转换为 PPT 格式的情况&#xff0c;请不要担心。我们本指南的目标是帮助用户将 PDF 转…

BeanFactory和ApplicationContext的入门、关系和继承

BeanFactory快速入门 ApplicationContext快速入门 BeanFactory与ApplicationContext的关系 1)BeanFactory是Spring的早期接口&#xff0c;称为Spring的Bean工厂。ApplicationContext是后期更高级接口&#xff0c;称之为Spring 容器; 2)ApplicationContext在BeanFactory基础上…

路径规划算法:基于瞬态优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于瞬态优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于瞬态优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法瞬态…