热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实现原子的不同方式*=

如何解决《实现原子的不同方式*=》经验,为你挑选了1个好方法。

通过本书学习,它介绍了如何实现像更复杂的操作operator*std::atomic.实现使用compare_exchange_weak,我想我明白这是如何工作的.现在,我自己实现了一些东西,看一看.

#include 
#include 
#include 

/*template ::value>>
std::atomic& operator*=(std::atomic& t1, T t2) {
    T expected = t1.load();
    while(!t1.compare_exchange_weak(expected, expected * t2))
    {}
    return t1;
}*/

template ::value>>
std::atomic& operator*=(std::atomic& t1, T t2) {
    T expected = t1.load();
    t1.compare_exchange_weak(expected, expected * t2);
    return t1;
}

int main() {
    std::atomic t1 = 5;
    std::atomic t2;
    t2 = (t1 *= 5).load();

    std::cout <<"Atomic t1: " <

我有两个版本的代码,书的版本被注释掉了.我不明白为什么我应该等待繁忙的循环来执行原子compare_exchange.在我的版本中,我只是在它自己的行上调用它并查看Godbolt中生成的程序集,两者都使用

lock cmpxchg dword ptr [rsp + 8], ecx

看起来和我很相似 那么,为什么我需要一个像书中那样的等待循环来使这个东西成为原子?是不是我的版本也很好并且原子地工作?



1> rmm19433..:

想象一下你的调用loadcompare_exchange_weak另一个线程改变的值.expected已不再是当前值.

compare_exchange_weak 工作原理如下:

原子地将*this的(对象表示(直到C++ 20)/值表示(自C++ 20))与预期的表示进行比较,如果这些是按位相等的,则将前者替换为所需的(执行读取 - 修改) - 写操作).否则,将存储在*this中的实际值加载到预期值(执行加载操作). cppreference

基于上面的描述t1不会改变,你的乘法也不会被存储.通过循环,您可以确保更新t1并存储乘法的结果或更新,expected并在循环的下一次迭代中再次尝试(循环仅在第一个案例发生时停止).


编辑:您可以通过模拟并发访问来"尝试"它.在交换结果之前,另一个线程进入并更改原子的值.在下面的compare_exchange_weak唯一影响expected.

+----------- Thread 1 -----------+---------- Thread 2 ----------+
| ex = t1.load()                 |                              |
|                                | t1.store(42)                 |
| t1.cmp_xchg_w(ex, ex * t2)     |                              |

此代码模拟并发访问并让单个线程休眠.

#include 
#include 
#include 
#include 
#include 

template ::value>>
std::atomic& operator*=(std::atomic& t1, T t2) {
    using namespace std::chrono_literals;
    T expected = t1.load();
    std::this_thread::sleep_for(400ms);
    t1.compare_exchange_weak(expected, expected * t2);
    return t1;
}

int main() {
    std::atomic t1 = 5;
    std::atomic t2;
    std::thread th1([&](){
        t2 = (t1 *= 5).load();
    });
    std::thread th2([&](){
        using namespace std::chrono_literals;
        std::this_thread::sleep_for(100ms);
        t1.store(8);
    });

    th1.join();
    th2.join();

    std::cout <<"Atomic t1: " <


推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温Linux内核:互斥和同步相关的知识,希望对你有一定的参考价值。文章目录 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • YoucanSolveaGeometryProblemtooProblemDescriptionManygeometry(几何)problemsweredesignedinth ... [详细]
  • STL学习笔记--数值算法
    数值算法  C++STL的数值算法(Numericalgorithms)是一组对容器元素进行数值计算的模板函数,包括容器元素求和accumulate、两序列元素的内积inner_pro ... [详细]
  • C++ 类的 this 指针 语法练习5
    #include<iostream>#include<string>usingnamespacestd;定义一个类Studentclass ... [详细]
  • [置顶]        C++类的构造函数与析构函数的调用顺序
    1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 ... [详细]
  • Igotthiscode(IknowitsinSpanishIcantranslateifneeded)wheretheygivemethefunctionS ... [详细]
  • 数据结构-图详解(图基本概念、图的存储结构及C++实现)
    本文主要介绍关于数据结构,c++,图论的知识点,对【数据结构-图详解(图基本概念、图的存储结构及C++实现)】和【数据结构图的存储结构代码】有兴趣的朋友可以看下由【NUC_Dodamce】投稿的技术文 ... [详细]
  • C++简单单向链表实现
    #include?pch.h#include?创建链表typedef?struct?ListTable?{int?nElement;????链表元素int?nSequence;???节点序号ListTable?* ... [详细]
  • 字符串的题目用库函数往往能大大简化代码量介绍几个常用的C的字符串处理库函数strtok()原型char*strtok(chars[],constchar*delim); ... [详细]
  • C++语言学习(六)——二阶构造模式
    C++语言学习(六)——二阶构造模式一、构造函数的问题构造函数存在的问题:A、构造函数只提供自动初始化成员变量的机会B、不能保证初始化逻辑 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼错误72error:ErroropeningoutputfileC:Users林鑫辰AppDataLocalTemptmpxft_0000 ... [详细]
author-avatar
狄言洁_171
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有