我正在尝试实现一个无锁列表。对于这个项目,我需要和原子比较和交换指令,可以比较32位指针到我的节点'结构
节点结构如下:
typedef struct node
{
int data;
struct node * next;
struct node * backlink;
}node_lf;
我正在使用_sync_val_compare_and_swap()来执行比较和交换操作。我的问题是,这个函数能否返回除int之外的值? 这就是我想要做的事情:
node_lf cs(node_lf * address, cs_arg *old_val, cs_arg *new_val)
{
node_lf ptr;
ptr = (node_lf)__sync_val_compare_and_swap ((int *)address, old_val->node, new_val->node);
return (ptr);
}
其中 cs_arg 是另一个用于保存节点指针和其他簿记信息的结构。
如果还有其他方法可以实现原子比较和交换,请建议。
答案 0 :(得分:1)
我的问题是,这个函数能否返回int以外的值?
答案是肯定的,__sync_val_compare_and_swap
可以使用int
以外的其他类型,包括char
,short
,long long
和__int128
(在x64)。
请注意,您可能需要将非整数类型转换为__sync_val_compare_and_swap
的适当大小的整数才能使用它们。