gpt4 book ai didi

c - 用原子替换条件?

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

我的代码中有如下条件

    pthread_spin_lock(&slock);
if (round_robin_next_ == hp_count() - 1 ) {
round_robin_next_ = 0;
} else {
round_robin_next_++;
}
pthread_spin_unlock(&slock);

我使用了一个自旋锁为了让上面的线程安全,并且确保每个线程得到的round_robin_next_的下一个值与前一个相比。如您所见,round_robin_next_ 是循环的,上升到某个值然后返回到 0。

我的问题是,上面的代码能否通过使用 gcc 内部函数以某种方式释放锁?或一些特定于平台的说明?我在使用 gcc 4.7 的 64 位 Linux 上,我对平台特定的解决方案很好,如果它不能被移植也没关系。

最佳答案

从某种意义上说,是的,你可以在没有锁的情况下编写上面的代码;但是,我当然同意其他人的意见,因为存在“为什么要取消锁定?”的问题。优化以移除锁可能会提供更好的性能,但是值得您花时间和精力专门针对当前需求编写代码。话虽如此,__sync_bool_compare_and_swap 足以实现几乎任何同步算法。例如:

do {
old = round_robin_next_;
if (old == hp_count() - 1) { new = 0; }
else { new = old + 1; }
} while (!__sync_bool_compare_and_swap(&round_robin_next_, old, new));

内在原子地评估内存位置是否仍然包含旧的,如果是,则将新的存储到该位置。如果该位置不仍然包含旧的,则返回 false 并再次尝试更新。

关于c - 用原子替换条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478956/

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