无锁的原子函数改变两个独立的内存位置
Atomic function without locks to change two independent memory locations
我有以下名为 updateEntry
的函数,它将一个值写入查找 table。我想创建此函数的多线程版本。
我正在研究原子操作 __sync_bool_compare_and_swap
但我不确定如何在此处正确应用它。
理论上是否可以在不锁定的情况下以原子方式实现此功能,因为它会更改两个独立的内存位置 entryLookup[id]
和 entry
?
void updateEntry(Entry ** entryLookup, unsigned int id, int val1, short val2){
Entry * entry = entryLookup[id];
entry->val1 = val1;
entry->val2 = val2;
entryLookup[id] += sizeof(Entry);
}
要使此线程安全,您可以先递增 entryLookup[id]
以确保稍后出现的任何其他线程无法更改相同的条目,然后填充值。返回旧值的地方需要原子加法:
void updateEntry(Entry ** entryLookup, unsigned int id, int val1, short val2)
{
Entry * entry = __sync_fetch_and_add(&entryLookup[id], sizeof(Entry));
entry->val1 = val1;
entry->val2 = val2;
}
我有以下名为 updateEntry
的函数,它将一个值写入查找 table。我想创建此函数的多线程版本。
我正在研究原子操作 __sync_bool_compare_and_swap
但我不确定如何在此处正确应用它。
理论上是否可以在不锁定的情况下以原子方式实现此功能,因为它会更改两个独立的内存位置 entryLookup[id]
和 entry
?
void updateEntry(Entry ** entryLookup, unsigned int id, int val1, short val2){
Entry * entry = entryLookup[id];
entry->val1 = val1;
entry->val2 = val2;
entryLookup[id] += sizeof(Entry);
}
要使此线程安全,您可以先递增 entryLookup[id]
以确保稍后出现的任何其他线程无法更改相同的条目,然后填充值。返回旧值的地方需要原子加法:
void updateEntry(Entry ** entryLookup, unsigned int id, int val1, short val2)
{
Entry * entry = __sync_fetch_and_add(&entryLookup[id], sizeof(Entry));
entry->val1 = val1;
entry->val2 = val2;
}