linux 如何在一个原子操作中组合合并比较和更新?

b1uwtaje  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(106)

我有两个线程,将执行:

_Atomic volatile uint64_t foo;

// returns 1 if it updated foo, 0 if fool already had the new value 
int try_to_update_foo(uint64_t new) {
    if (foo < new) {
        foo = new;
        return 1;
    }
    return 0;
}

我希望foo < new比较和foo = new赋值操作是一个原子操作。
也就是说,如果两个线程都试图将foo更新为相同的新值,则其中一个必须返回1,另一个必须返回0。(不管是哪种方式)。
我可以在C11中实现这一点,而不涉及信号量/互斥量吗?

dddzy1tm

dddzy1tm1#

您可以使用atomic_compare_exchange_weak()atomic_compare_exchange_strong()

#include <stdatomic.h>

_Atomic uint64_t foo;

int try_to_update_foo(uint64_t new) {
    uint64_t expected = atomic_load(&foo);
    while (expected < new) {
        if (atomic_compare_exchange_weak(&foo, &expected, new)) {
            return 1;
        }
    }
    return 0;
}

详情请参见文档:https://en.cppreference.com/w/c/atomic/atomic_compare_exchange

相关问题