C ++ 11:atomic :: compare_exchange_weak是否支持非基本类型?

时间:2017-07-27 09:02:44

标签: c++ multithreading c++11 atomic

我有以下代码:

#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,

所以我的问题:

  
      
  1. std :: atomic :: compare_exchange_weak是否适用于复杂的结构?

  2.   
  3. 如果intel cpu硬件CMPEXG仅在64位长度的高速缓存行内工作,那么大于8字节的结构是否适用于CMPEXG?它仍然是原子操作吗?

  4.   
  5. 如何解决我的计划?

  6.   

感谢。

1 个答案:

答案 0 :(得分:3)

  

std :: atomic :: compare_exchange_weak是否适用于复杂的结构?

是的,但conditions包括trivially copyabletrivially constructible

  

如果intel cpu硬件CMPEXG仅在64位长度的高速缓存行内工作,那么大于8字节的结构是否适用于CMPEXG?

没有。它不会那样工作。如果你创造了像你那里那样疯狂的大结构,那么你的代码将不会是&#34; lockfree&#34;。您的编译器将发出总线锁以确保线程安全,这就是为什么您永远不应该使用大数据结构执行您正在执行的操作。如果不是更多,您将使您的程序减慢数百次。考虑以原子方式交换指针。

  

它仍然是原子操作吗?

不,它使用锁。您可以使用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;
}