想象一下这样的结构:
struct my_struct {
uint32_t refs
...
}
通过查找表获取指针:
struct my_struct** table;
my_struct* my_struct_lookup(const char* name)
{
my_struct* s = table[hash(name)];
/* EDIT: Race condition here. */
atomic_inc(&s->refs);
return s;
}
在多线程模型中,取消引用和原子增量之间存在竞争。鉴于这是对性能非常关键的代码,我想知道解引用和原子增量之间的这种竞争通常是如何解决或解决的?
编辑:通过查找表获取指向my_struct
结构的指针时,有必要首先取消对结构的引用以增加其引用计数。当其他线程可能正在更改引用计数并可能释放对象本身时,这会在多线程代码中产生问题,而另一个线程随后会取消引用指向不存在内存的指针。再加上先发制人和一些坏运气,这可能是灾难的根源。