昨日总结与自省
- 工作推进一小部分
- 昨天午休前终于学了一点编程,但是没看20分钟就困的睡着了,跟看抖音完全不同
- 其他技术好像没怎么学
- 年终奖shit。真操蛋。
今日计划
- 把工作完成
- 学习编程
- 继续学习多线程
- 看一道leetcode题目
学习笔记
c++原子类型的成员函数:
- store()是存储操作,也相当于“赋值”;
- load()是载入操作,相当于“取值”;
- 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返回之前的值
- 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.