概述
线程间同步通常的实现方法通常为互斥锁,但互斥锁对性能造成了影响,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和releasememory_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应用开发。欢迎合作。