次のような構造を想像してください。
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
、参照カウントをインクリメントするために、最初に構造体を逆参照する必要があります。これにより、他のスレッドが参照カウントを変更し、別のスレッドが存在しないメモリへのポインターを逆参照している間にオブジェクト自体の割り当てを解除する可能性がある場合、マルチスレッド コードで問題が発生します。プリエンプションといくつかの不運が組み合わさると、これは災害のレシピになる可能性があります.