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