基于原子变量的内存模型优化

概述

线程间同步通常的实现方法通常为互斥锁,但互斥锁对性能造成了影响,C++11引入了内存模型,定义了STD::memory_order枚举,结合原子性操作,实现无锁线程数据同步。

关于memory_order

memory_order_relaxed:针对当前的读写操作仅能保持原子性,但是不能保证顺序。

memory_order_acquire:有此内存顺序的加载操作,在其影响的内存位置进行获得操作,当前线程中读或写不能被重排到此加载前。

memory_order_release:有此内存顺序的存储操作进行释放操作,当前线程中的读或者写不能被重排到此存储后。

memory_order_seq_cst:原子操作不仅以与释放/获得顺序相同的方式排序内容(在一个线程中先发生于存储的任何结果都变成进行加载的线程的可见副效应),目前方法默认为该属性。

typedef enum memory_order {
	memory_order_relaxed,//宽松操作,没有同步或顺序制约,仅原子性
	memory_order_consume,
	memory_order_acquire,//本线程中,所有后续的读操作必须在本条原子操作完成后执行
	memory_order_release,//本线程中,所有之前的写操作完成后才能执行本条原子操作
	memory_order_acq_rel,//同时包含acquire和release
	memory_order_seq_cst//全部存取都按照顺序执行
} memory_order;

测试Demo1

#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>

std::atomic<bool> running{true};
std::atomic<int> counter{0};

void worker() {
  while(running) {
    counter.fetch_add(1, std::memory_order_relaxed);
  }
}

int main() {
  std::thread worker1(worker);
  std::thread worker2(worker);
  std::this_thread::sleep_for(std::chrono::seconds(1));
  running = false;
  worker1.join();
  worker2.join();
  std::cout << "Counter: " << counter << std::endl;
}

我公司承接各类技术服务,主要聚焦于:stm32、单片机、嵌入式、QT应用开发、Web+Python+Django应用开发。欢迎合作。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汉森教育

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值