2024.3.16记

本文介绍了C++中原子类型的操作,如store(),load(),exchange(),重点讲解了compare_exchange_weak()和compare_exchange_strong()的原理及在处理并发时的注意事项,包括可能出现的spuriousfailure。
摘要由CSDN通过智能技术生成

昨日总结与自省

  1. 工作推进一小部分
  2. 昨天午休前终于学了一点编程,但是没看20分钟就困的睡着了,跟看抖音完全不同
  3. 其他技术好像没怎么学
  4. 年终奖shit。真操蛋。

今日计划

  1. 把工作完成
  2. 学习编程
  3. 继续学习多线程
  4. 看一道leetcode题目

学习笔记

c++原子类型的成员函数:

  1. store()是存储操作,也相当于“赋值”;
  2. load()是载入操作,相当于“取值”;
  3. exchange是“读-改-写”操作;
    std::atomic<bool> b;
    bool x = b.load(std::memory_order_acquire);
    b.store(true);  /
    x = b.exchange(false, std::memory_order_acq_rel); // exchange返回之前的值
  1. compare_exchange_weak()/compare_exchange_strong()依据原子对象当前的值决定是否保存新值。这种操作被称为“比较-交换”操作。是原子类型的编程基石。
bool expected = false;
bool res = b.compare_exchange_weak(expected, true)

使用者给定一个期望值(expected),原子变(b)将和它比较,如果相等,该原子变量就存入另一个既定的值(true),否则更新期望值所属的变量(expected),向它赋予原子变量(b)的值。该函数返回bool类型的值,如果完成了保存动作(前提是期望值和原子值相等),则操作成功,返回true;否则操作失败,函数返回false.

对于compare_exchange_weak(),即使原子变量(b)的值等于期望值(expected),保存动作还是有可能失败,在这种情况下,原子变量维持原来的值不变,并返回false。这是由于“比较-交换”操作不能一步完成导致,可能在“比较”与“交换”之间的空隙中被其他线程切出导致。我们称之为“佯败(spurious failure)”。因此它往往配合循环使用。

bool expected = false;
extern atomic<bool> b;
while(!b.compare_exchange_weak(expected, true) && !expected);

开始时expected为false.
a. 假设外部变量b初始值为false. 如果compare_exchange_weak返回true.则修改成功,while结束; b的值变为true。如果返回false, 则expected也为false,表示“佯败”,while继续,直到修改成功。
b. 假设外部变量b初始值为true,则第一次调用compare_exchange_weak必返回false。并将expected设置为true。!expected则为false, while推出。
综合while之后b的值永远都是true.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值