我正在编写一个库,其中另一种语言的连接库只能理解 C。我需要类似于std::shared_ptr
共享所有权的东西。在我的情况下,手动引用计数就可以了。
C11 支持原子操作。我一直在尝试找到一个如何正确执行此操作的示例,但是我能够找到的每个示例都与 C++11 有关,它具有运算符重载。
基本上我想做的是这样的:
typedef struct {
union {
int integer;
// ...
char* cstring;
void* ptr;
};
enum {
Undefined,
Integer,
String,
// ...
} type;
int* refcount;
} value;
void value_retain(value v) {
++(*v.refcount);
}
void value_release(value v) {
if(--(*v.refcount) == 0) {
// free memory, depending on type...
}
}
我假设我需要更改int*
为atomic_int*
. 函数atomic_fetch_sub表示它返回“先前保存的值是 obj 指向的原子对象。”。这让我相信我的函数看起来像这样:
void value_retain(value v) {
atomic_fetch_add(v.refcount, 1);
}
void value_release(value v) {
if(atomic_fetch_sub(v.refcount, 1) == 1) {
// free memory, depending on type...
}
}
这甚至正确吗?我担心的是atomic_fetch_sub
返回的值是什么,而不是值是什么。
还有什么memory_order
意思,我应该用什么来进行引用计数?有关系吗?