C中的原子递减和测试

use*_*363 7 c atomic c11 stdatomic

我正在C中实现一个需要使用多个线程的引用计数系统.因此,我需要一种方法来减少整数引用计数,并测试一次原子操作结果是否为零.我可以使用C11 stdatomic.h,但似乎没有减量和测试操作.

这是最好的(即最便携的)方式吗?我可以使用这些stdatomic.h功能来实现吗?


这是引用计数(伪代码)的核心:

retain(object) {
    ++object.ref_count;  // pretty easy to make this atomic
} 

release(object) {
    if (--object.ref_count == 0)  // need this to be atomic also
        free(object)
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*edt 5

你似乎对C11的原子有一个误解.Atomic限定类型,而不是单个操作.

如果声明变量的_Atomic所有操作都是原子的.因此,如果您对原子操作的默认"顺序一致性"(您应该)感到满意,那么您只_Atomic需要一个额外的限定条件.并且前缀--运算符应该可以满足您的需要.

如果你想要处理你可以使用的不同类型的一致性atomic_fetch_sub,例如只有你那么你在修改之前获得了值而不是之后的那个.所以不要与0你比较,而应该将它与之比较1.