【发布时间】:2012-02-13 00:20:50
【问题描述】:
所以我读到,在 32 位机器上,可以将 CAS 操作与对齐的 64 位块一起使用。
同样,在 64 位机器中,可以使用 CAS 操作与对齐的 128 位块。
我使用的是 32 位机器,所以我尝试了以下方法:
// sizeof(long long) is 8 bytes, so 64 bits
long long y = 12;
long long z = 12;
long long x = 99;
__sync_bool_compare_and_swap(&y, z, x);
并且CAS 成功将y 的值更改为99。
但后来我尝试使用 char array[8];(大小为 64 位)而不是 long long。我愿意:
char full[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};
char full2[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};
char full3[8] = {'5', '8', '9', 'G', 'X', '5', '6', 'U'};
__sync_bool_compare_and_swap(full, full2, full3);
但在这种情况下,CAS 失败,尽管 full 和 full2 具有完全相同的数据。 (我还检查了 full 和 full2 正确对齐的位置)
所以第一次似乎CAS可以用于64位,但第二次似乎不能。任何想法为什么?
编辑
(64位机器怎么样?)
好的,所以问题是我在我的CAS 中使用了char *,而这些只是被检查了。所以解决方案是转换为 long long 或 uint64_t,它们是 64 位值。
但是当我需要使用 128bit 值时,我应该如何处理 64bit 机器? long long 在 64 位机器中仍然是 64 位,而 uint128_t 在 C 中似乎不存在。那么我应该转换为哪种类型? double long 在我的 64 位机器中似乎是 128 位,但是在执行以下操作时:
double long y = 32432143243214;
double long z = 32432143243214;
int x = __sync_bool_compare_and_swap(&y, z, 1234321990);
我得到这个编译错误
error: incompatible type for argument 1 of ‘__sync_bool_compare_and_swap’.
【问题讨论】:
-
看起来你正在衰减到指针并且没有传递值
标签: c multithreading gcc atomic compare-and-swap