C ++ 11:确实是atomic :: compare

我有以下代码:

#include<atomic>
#include<iostream>
using namespace std;

struct Big{
    int i;
    int j;
    int k[100];
};
int main(){
    atomic<int> i;
    cout<<i.load()<<endl;
    i.store(20);
    cout<<i.load()<<endl;
    i.exchange(30);
    cout<<i.load()<<endl;

    atomic<Big> ab,expect,value;
    ab.compare_exchange_weak(expect,value,memory_order_release,memory_order_relaxed);//error
    return 0;
}

那么,原子运行良好,但我希望看看compare_exchange_weak的非锁定函数是否适用于复杂的数据结构。 用--std = c ++ 11编译它给了我:

error: no matching member function for call to 'compare_exchange_weak'
    ab.compare_exchange_weak(expect,value,memory_order_release,memory_order_relaxed);
    ~~~^~~~~~~~~~~~~~~~~~~~~
candidate function not viable: no known conversion from 'atomic<Big>' to 'Big &' for 1st argument
    bool compare_exchange_weak(_Tp& __e, _Tp __d,

所以我的问题是:

  • std :: atomic :: compare_exchange_weak是否可以处理复杂的结构?

  • 如果intel cpu硬件CMPEXG只能在64位长度的高速缓存行中工作,那么对于CMPEXG,结构是否大于8个字节? 它仍然是原子操作吗?

  • 如何解决我的计划?

  • 谢谢。


    std :: atomic :: compare_exchange_weak是否可以处理复杂的结构?

    是的,但是有些条件包括可复制的和可以构造的。

    如果intel cpu硬件CMPEXG只能在64位长度的高速缓存行中工作,那么对于CMPEXG,结构是否大于8个字节?

    不,它不会那样工作。 如果你创建了一个疯狂的大型结构,那么你的代码将不会“无锁”。 你的编译器会发布总线锁来确保线程安全,这就是为什么你永远不应该做你在那里用大数据结构做的事情。 如果不是更多,你会减慢你的程序数百次。 考虑原子交换指针。

    它仍然是原子操作吗?

    不,它使用锁。 你可以用std::atomic::is_lock_free()来测试它

    如何解决我的计划?

    你去那里:

    #include <atomic>
    #include <iostream>
    
    using namespace std;
    
    struct Big {
      int i;
      int j;
      int k[100];
    };
    
    int main() {
      Big value, expect;
      atomic<Big> ab;
      ab.compare_exchange_weak(expect, value);
      return 0;
    }
    
    链接地址: http://www.djcxy.com/p/78223.html

    上一篇: C++11: does atomic::compare

    下一篇: safe increment with modulo without mutex using std::atomic