涿州网站建设公司厦门网站建站

张小明 2026/1/19 20:52:59
涿州网站建设公司,厦门网站建站,小程序官网模板,网站的关键词排名1. atomicC11 引入的 atomic 头文件和 std::atomic 模板是无锁并发编程的核心#xff0c;用于实现多线程间的原子操作#xff0c;避免数据竞争#xff08;data race#xff09;#xff0c;替代传统的互斥锁#xff08;如 std::mutex#xff09;以提升并发性能。…1. atomicC11 引入的atomic头文件和std::atomic模板是无锁并发编程的核心用于实现多线程间的原子操作避免数据竞争data race替代传统的互斥锁如 std::mutex以提升并发性能。使用atomic的成员函数对T类型的数据进行操作是原子的这就使得某些简单的操作不再需要我们去加锁访问而是直接采用原子操作。例如一个多线程共享的计数器atomicint a_cnt 0; int cnt 0; void func() { for (int i 0; i 100000; i) { a_cnt; cnt; } } int main() { vectorthread pool; for (int i 0; i 4; i) { pool.emplace_back(func); } for (auto t : pool) { t.join(); } cout 原子 a_cnt endl; cout 非原子 cnt endl; return 0; }值得注意的是atomic作为模板实际上并不完全支持所有类型。主要支持的是整型家族、指针类型以及任何满足 CopyConstructible 和 CopyAssignable 的可简单复制 (TriviallyCopyable)类型例如struct Counters { int a; int b; }; // user-defined trivially-copyable type std::atomicCounters cnt; // specialization for the user-defined type从C20开始atomic对智能指针进行了特化如果如下六个函数的返回值均为true则说明类型 T可以使用原子操作否则不行std::is_trivially_copyableT::value std::is_copy_constructibleT::value std::is_move_constructibleT::value std::is_copy_assignableT::value std::is_move_assignableT::value std::is_sameT, typename std::remove_cvT::type::value注意std::atomic 对象不可拷贝、不可移动因为拷贝 / 移动会破坏原子性。1.1 核心成员函数函数功能load原子读取值store原子写入值exchange原子交换值返回旧值写入新值compare_exchange_weak/strong比较并交换CAS核心原子操作实现无锁算法的基础fetch_add/fetch_sub原子加减返回旧值仅对整数 / 指针类型有效operator/--原子自增 / 自减重载运算符等价于fetch_add(1)/fetch_sub(1)operator原子赋值等价于 store(val)is_lock_free()判断当前原子操作是否 “无锁”否则内部可能用互斥锁实现1.2 CAS操作CAS 是无锁编程的基石即Compare And Set或Compare And Swap上面所有对值进行修改的成员函数底层都是通过如下两个函数实现bool compare_exchange_weak( T expected, T desired) bool compare_exchange_strong( T expected, T desired)这两个函数均为原子操作依赖于硬件提供的CAS指令核心原理为比较原子对象的当前值与expected若相等将原子对象值设为desired返回true若不等将expected更新为原子对象的当前值返回false。weak 与 strong 的区别在于是否使用缓存一致性协议weak弱版本可能 “伪失败”值相等但返回 false性能更高strong强版本值相等时必成功无伪失败。例如operator的底层实现可能与Add函数的实现相似atomicint a_cnt 0; int cnt 0; void Add(atomicint cnt) { int old cnt.load(); // cnt与old的值相同则将new赋值给cnt否则将cnt的值更新给old // 确保将数据写回之前没有其他线程对目标数据进行了修改进而导致数据的覆盖 // 本质上来说atomic的原理就是在将数据写回之前验证数据是否已被其他线程修改 // 若已被修改则重新计算更新后的值并再次尝试写回直到某次成功 // while (!atomic_compare_exchange_weak(cnt, old, old 1)); while (!a_cnt.compare_exchange_weak(old, old 1)); } void func() { for (int i 0; i 100000; i) { Add(a_cnt); cnt; } } int main() { vectorthread pool; for (int i 0; i 4; i) { pool.emplace_back(func); } for (auto t : pool) { t.join(); } cout 原子 a_cnt endl; cout 非原子 cnt endl; return 0; }再例如使用CAS操作实现无锁的链式栈部分代码#pragma once #include atomic template typename T class Node { int _val; Node* _next; Node(int val 0, Node* next nullptr) :_val(val) ,_next(next) { } }; template typename T class LockFreeStack { public: void push(const T val) { NodeT* newNode new NodeT(val, _head.load()); while (!_head.compare_exchange_weak(newNode-next, newNode)); } private: std::atomicNodeT* _head nullptr; };1.3 内存序Memory Orderstd::atomic 的所有操作都可指定内存序参数默认 std::memory_order_seq_cst用于控制指令重排序编译器 / CPU 是否会重排原子操作的前后指令内存可见性一个线程的写操作对另一个线程的读操作的可见性。例如内存序枚举值含义memory_order_relaxed松散序仅保证操作本身原子性无可见性 / 重排序约束最弱memory_order_consume消费序保证对依赖于该原子操作的读写不重排C20 已弃用memory_order_acquire获取序读操作禁止后续指令重排到该操作前且能看到之前的释放操作memory_order_release释放序写操作禁止之前指令重排到该操作后且写结果对获取序可见memory_order_acq_rel同时具备 acquire 和 release 语义用于读写操作如 CASmemory_order_seq_cst顺序一致序所有线程看到的操作顺序一致最强默认性能最差通常来说使用默认内存序即可各内存序的效率差别实际上并不大优先保证正确性。在要求极致性能的场景下我们再考虑对内存序进行优化。2. 原子操作实现自旋锁#pragma once #include atomic class SpinLock1 { public: void lock() { // exchange: 将对象值设置为参数值返回原本的值 while (_flag.exchange(true)) { // 自旋等待锁释放 } } void unlock() { _flag.store(false); } private: std::atomicbool _flag false; }; class SpinLock2 { public: void lock() { while (_flag.test_and_set()) { // 自旋等待锁释放 } } void unlock() { _flag.clear(); } private: std::atomic_flag _flag ATOMIC_FLAG_INIT; };3. 无锁队列未来补充。。。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站服务器备案查询金坛网站建设公司

原文链接:https://ai225.com/article/memvid-introduction 在AI技术快速发展的今天,如何高效存储和检索大量知识数据成为了一个重要挑战。Memvid作为一个创新的开源项目,提供了一种全新的解决方案:将数百万个文本块压缩为单个可搜…

张小明 2026/1/17 18:13:36 网站建设

网站建设毕业设计目录爱分享wordpress

还在为无法下载Sketchfab平台的精美3D模型而困扰吗?想要轻松获取优质3D资源却苦于没有合适工具?这款专为Firefox浏览器打造的Sketchfab下载脚本,将彻底解决你的3D模型获取难题。无论你是设计师、开发者还是3D爱好者,这个完全免费的…

张小明 2026/1/17 18:13:36 网站建设

做酒店网站有哪些目录电子商务公司名称大全集最新

Facebook小组运营:聚集全球TensorRT爱好者 在AI模型越来越“重”的今天,一个训练好的深度学习网络从实验室走向真实场景时,往往面临尴尬的现实:推理延迟太高、吞吐上不去、显存爆掉。尤其是在边缘设备部署视觉模型或服务端承载高并…

张小明 2026/1/17 18:13:39 网站建设

金品诚企网站建设品牌网站设计服务

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 前言:凌晨三点,我对着空白文档发呆 这已经是我第三周在深夜和开题报告搏斗了。 不是不想写,是不知道从哪开始。导…

张小明 2026/1/17 18:13:40 网站建设

公共图书馆门户网站建设总结我想在家办个小型加工厂

AutoGPT打造自动播客生成系统:从脚本到音频 你有没有想过,有一天只需一句话——比如“做个关于AI伦理的10分钟科普播客”——然后系统就能自己查资料、写稿子、配音、出成品?这听起来像科幻片的情节,但在今天的技术条件下&#xf…

张小明 2026/1/17 18:13:41 网站建设