이런 구조를 상상해잠금없는 참조 카운트 역 참조에 레이스 조건을 극복
가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;
}
레이스 사이에 존재한다 : 포인터는 룩업 테이블을 통해 획득되는
struct my_struct {
uint32_t refs
...
}
다중 참조 모델에서 참조 해제 및 원자 증가. 이것이 매우 중요한 코드라는 것을 감안할 때, 나는이 레이스가 어떻게 역 참조와 원자 증가가 일반적으로 해결되거나 해결되는지 궁금해하고 있었습니까?
편집 : 룩업 테이블을 통해 my_struct
구조체에 대한 포인터를 획득 할 때 먼저 참조를 증가시키기 위해 구조를 역 참조해야합니다. 다른 스레드가 참조 카운트를 변경하고 잠재적으로 객체 자체의 할당을 해제 할 때 다른 스레드가 존재하지 않는 메모리에 대한 포인터를 비 참조 할 때 다중 스레드 코드에서 문제가 발생합니다. 선매 및 불운과 결합하여 재앙을 초래할 수 있습니다.
자세히 설명해 주시겠습니까? 나는 그 종족이 무엇인지 분명하지 않습니다. –
@BlankXavier 확실히, 제 편집을 참조하십시오. 감사! – haste
아. OP에서 명백하지 않은 구조체의 할당을 해제합니다. –