2016-06-10 148 views
0

我想实现一个锁定空闲列表。对于这个项目,我需要和原子比较和交换指令,可以将32位指针与我的'节点'结构进行比较。可以_sync_val_compare_and_swap返回int以外的任何东西吗?

节点结构如下:

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是另一种结构来保持节点指针和其他记录信息。

如果还有其他方法来实现原子比较和交换,请建议。

回答

1

我的问题是,该函数是否可以返回int以外的值?

答案是肯定的,__sync_val_compare_and_swap可以用比其他int类型,包括charshortlong long__int128(在x64上)工作。

请注意,您可能需要将非整数类型转换为合适大小的整数,以便__sync_val_compare_and_swap与它们一起使用。