gpt4 book ai didi

c - C-使用GCC原子内置函数实现fetchAndSet-有更好的方法吗?

转载 作者:行者123 更新时间:2023-12-03 13:20:37 25 4
gpt4 key购买 nike

我正在寻找一种简单有效的方法来使用GCC原子内置函数来实现简单的fetchAndSet。我看到的最接近here的是__sync_lock_test_and_set内置的,但是不会像其他函数那样发出完整的内存屏障,而所有其他函数要么执行操作(加,减,异或等),要么是有条件的(比较和交换功能)。这些将不起作用,因为我试图操纵一个保存任意指针数据的变量。

我能想到的最好的是这样的:

type *fetchAndSet(type **loc, type *newvar) {
while (1) {
type *oldvar = __sync_fetch_and_add(loc, 0);
if (__sync_bool_compare_and_swap(loc, oldvar, newvar)) return oldvar;
}
}

...换句话说,我从原子上获取内存位置的值,然后在成功用新值替换旧值后立即退出循环。我对这个解决方案并不真正满意,因为它不是单个原子操作,如果两个或多个线程争夺同一个内存位置,则存在相当大的饥饿风险。所以,我的问题是:有更好的方法吗?

最佳答案

使用gcc 4.6中的内置函数(每个链接),您可以将示例代码更改为(理想情况下)仅发出一条同步指令,因为您无需通过同步获取值。

type *fetchAndSet(type **loc, type *newvar) {
while (1) {
type *oldvar = *loc;
if (__sync_val_compare_and_swap(loc, oldvar, newvar) == oldvar) return oldvar;
}
}

第二种选择是在调用__sync_lock_test_and_set()之前添加__sync_synchronize(),以便存在一个完整的障碍。

除了gcc 4.6的内建函数外,我还请您引用R的答案。

关于c - C-使用GCC原子内置函数实现fetchAndSet-有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502678/

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