我正在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) }
解决方法
你似乎对C11的原子有一个误解. Atomic限定类型,而不是单个操作.
如果使用_Atomic声明变量,则对它的所有操作都是原子的.因此,如果您对原子操作的默认“顺序一致性”(您应该)感到满意,那么您只需要一个额外的_Atomic资格.并且前缀 – 运算符应该可以满足您的需要.
如果你想处理不同类型的一致性,可以使用atomic_fetch_sub,例如:只有那时你才能获得修改前的值,而不是之后的值.因此,不应将其与0进行比较,而应将其与1进行比较.