比较和交换2D阵列

时间:2015-11-18 17:14:31

标签: c++ multithreading multidimensional-array atomic compare-and-swap

我试图从不同的线程原子地写入2d数组(float ** W)。但CAS总是会出现此错误:__sync_bool_compare_and_swap的参数1的不兼容类型

c = __sync_bool_compare_and_swap(&W[uu][i], a, b);

当我写一个1d数组时,它像往常一样工作正常。

有关如何使这项工作的任何想法?我可以尝试在每个线程中制作1d数组,然后在屏障后更新这个2d数组,但这会占用太多内存。我使用的是Ubuntu / Linux。

感谢。

1 个答案:

答案 0 :(得分:4)

main() {
  int* W = malloc(10);  
  int uu = 1, i = 3;
  __sync_val_compare_and_swap(&W[uu], 1, 2);
}

编译好,但是:

main() {
  float* W = malloc(10);  
  int uu = 1, i = 3;
  __sync_val_compare_and_swap(&W[uu], 1.0f, 2.0f);
}

不编译给我你写的完全相同的信息。这表明不支持浮动:

  

英特尔文档中给出的定义仅适用于   使用int,long,long long类型以及unsigned类型   同行。 GCC将允许任何整数标量或指针类型   长度为1,2,4或8个字节。

看起来这证实了这一点。

如果你没有使用itanium那么可能

  

四个非算术函数(加载,存储,交换和   compare_exchange)也都有通用版本。这个通用   版本适用于任何数据类型。

您可以使用__atomic_compare_exchange*因为这些应该根据文档适用于任何类型。我还没有尝试过。

修改

main() {
  float* W = malloc(10);  
  float target;
  float val = 5.0f;
  __atomic_exchange(&W[4], &val, &target, __ATOMIC_RELAXED);
}

^ - 这至少可以编译。