我有以下函数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);
}
答案 0 :(得分:1)
为了使此线程安全,您可以先增加Type
以确保以后出现的任何其他线程不能更改相同的条目,然后填写值。返回旧值时需要添加原子:
entryLookup[id]