2016-06-10 12 views
0

Ich versuche eine Lock-freie Liste zu implementieren. Für dieses Projekt brauche ich einen atomaren Vergleichs- und Auslagerungsbefehl, der einen 32-Bit-Zeiger mit meiner 'Knoten'-Struktur vergleichen kann.kann _sync_val_compare_and_swap irgendetwas anderes als int zurückgeben?

Der Knoten struct ist wie folgt:

typedef struct node 
{ 
    int data; 
    struct node * next; 
    struct node * backlink; 
}node_lf; 

Ich verwende _sync_val_compare_and_swap() durchzuführen Betrieb Vergleichs- und Auslagerungs. Meine Frage ist, kann diese Funktion einen anderen Wert als int zurückgeben? Dies ist, was ich zu tun versucht:

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); 
} 

wo cs_arg eine andere Struktur ist der Knotenzeiger und andere Buchhaltungsinformationen zu halten.

Wenn es andere Methoden gibt, Atomvergleich und -tausch zu implementieren, schlagen Sie bitte vor.

Antwort

1

Meine Frage ist, kann diese Funktion einen anderen Wert als int zurückgeben?

Die Antwort ja ist, __sync_val_compare_and_swap kann mit anderen Typen arbeiten als int, einschließlich char, short, long long und __int128 (auf x64).

Beachten Sie, dass Sie möglicherweise Nicht-Integer-Typen in eine geeignete ganze Ganzzahl für __sync_val_compare_and_swap umwandeln müssen, um mit ihnen zu arbeiten.