原子功能无锁可以更改两个独立的存储位置



i具有以下称为 updateEntry的函数,该功能将值写入查找表中。我想创建此功能的多线程版本。我正在研究原子操作__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;
}

相关内容

  • 没有找到相关文章

最新更新