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

news/2024/11/14 12:32:48/

目录

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.ppmy.cn/news/789569.html

相关文章

WebGIS 信息系统-Element项目实战

WebGIS 信息系统-Element项目实战 Element的安装OpenLayers的安装采用直接引用的方式配置开发环境下载Vue文件下载Element文件下载OpenLayers文件 Element的安装 在项目的根目录中&#xff0c;首先按下 Shift鼠标右键&#xff0c;在弹出的右键菜单中选择“在此处打开命令行窗口…

JavaScript验证手机号码、电子邮箱格式

验证电话号码 function checkPhone(phone) {if (!(/^1[3456789]\d{9}$/.test(phone))) {alert("输入电话号码格式有误");return false;}return true; }验证电子邮箱 function checkEmail(email) {if (!(/^(\w-*\.*)(\w-?)(\.\w{2,})$/.test(email))) {alert("…

基于golang的手机号格式验证和邮箱格式验证(正则表达式)

废话不多说&#xff0c;直接上代码 //email verify func VerifyEmailFormat(email string) bool {//pattern : \w([-.]\w)*\w([-.]\w)*\.\w([-.]\w)* //匹配电子邮箱pattern : ^[0-9a-z][_.0-9a-z-]{0,31}([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$reg : regexp.Mu…

python 校验邮箱格式、手机号格式

校验邮箱 import redef validateEmail(email):if re.match("^.\\(\\[?)[a-zA-Z0-9\\-\\.]\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) ! None:print("成功")return Trueelse:print("失败")return TruevalidateEmail(123abc.net.cn) 校验…

JS验证手机号,密码,邮箱格式

相关解释&#xff1a; 1. /^$/ 这个是个通用的格式。 ^ 匹配输入字符串的开始位置&#xff1b;$匹配输入字符串的结束位置 2. 里面输入需要实现的功能。 * 匹配前面的子表达式零次或多次&#xff1b; 匹配前面的子表达式一次或多次&#xff1b;…

vue3格式校验邮箱和手机号

vue3格式校验邮箱和手机号这里写自定义目录标题 <q-input outlined dense :rules"[(val) > val ! null || val?.trim() ! || 邮箱不能为空,val>/^[0-9a-zA-Z_.-][][0-9a-zA-Z_.-]([.][a-zA-Z]){1,2}$/.test(val)|| 请输入正确的邮箱格式]" v-model"e…

正则验证手机号码和邮箱格式

前言 使用正则验证手机及电话号码是否正确&#xff0c;在JSP中操作 <div class"row clearfix"><div class"col-3 t-r">电话&#xff1a;</div><div class"col-7"><input type"text" id"tel" na…

【密码学篇】GM密码行业标准下载方法

【密码学篇】GM密码行业标准下载方法 截止到2023年07月08日&#xff0c;密码行业标准化技术委员会共发布了144个密码行业标准&#xff0c;可点击链接预览或使用IDM下载器下载标准&#xff0c;此外该方法很多场景都适用&#xff0c;自行尝试—【蘇小沐】 文章目录 【密码学篇】…