gpt4 book ai didi

c - 64 位比较和交换 (CAS) 应该在 32 位机器上工作吗? (或 64 位机器?)

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:28 25 4
gpt4 key购买 nike

所以我读到,在一台 32 位机器上,可以对对齐的 64 位 block 使用 CAS 操作。同样,在 64 位机器中,可以对对齐的 128 位 block 使用 CAS 操作。

我使用的是 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);

但在这种情况下,尽管 fullfull2 具有完全相同的数据,但 CAS 失败了。 (我还检查了 fullfull2 是否正确对齐)

所以第一次好像CAS可以用到64bit,第二次好像不行。有什么想法吗?

编辑

(64位机器怎么样?)

好的,所以问题是我在我的 CAS 中使用了 char * 并且只检查了这些。所以解决方案是转换为 long longuint64_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);

我得到这个编译错误 错误:“__sync_bool_compare_and_swap”的参数 1 的类型不兼容

最佳答案

您应该传递 full2 和 full3 的值,而不是指向它的指针。此外,您应该注意对齐。

__sync_bool_compare_and_swap((long long*)full,*(long long*)full2,*(long long*)full3);

(当然这不是可移植的,如果要可移植,就用uint64_t代替long long)

关于c - 64 位比较和交换 (CAS) 应该在 32 位机器上工作吗? (或 64 位机器?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com