无锁的原子函数改变两个独立的内存位置

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