Linux 3.0은 futex이라는 시스템 호출을 제공합니다.이 시스템 호출에는 최근의 pthread_mutex 구현을 포함하여 많은 동시성 유틸리티가 기반을두고 있습니다. 코드를 작성할 때마다 항상 기존 구현을 사용할지 직접 작성 할지를 고려해야합니다.Linux 3.0 : futex-lock 교착 상태 버그?
위는 퓨 텍스에 따라 잠금 (뮤텍스, 1 허가 카운팅 세마포어)의 구현과 여러 스레드가 잠금 및 잠금을 해제하려고하는 이에 후 교착 버그가 포함되어있는 것 같습니다 man futex(7)
의 의미 설명입니다 수천 번 스레드는 x == -1 인 모든 스레드가 CompareWait에 고정 된 상태가 될 수 있지만 아무도 잠금을 보유하지는 않습니다.
누구에게 버그가 있는지 알 수 있습니까?
업데이트 : futex (7)/의미가 너무 깨졌습니다. 나는 Lock을 완전히 다음과 같이 다시 작성했습니다 ... 지금이게 맞습니까?
// CompareAssign(x,y,z) atomically: if (x == y) {x = z; ret true; } else ret false;
struct Lock
{
Lock() : x(0) {}
void lock()
{
while (!CompareAssign(x, 0, 1))
if (x == 2 || CompareAssign(x, 1, 2))
CompareWait(x, 2);
}
void unlock()
{
if (SubFetch(x, 1) == 0)
return;
x = 0;
Wake(x, 1);
}
private:
int x;
};
생각이 여기에
x는 다음과 같은 세 가지 상태를 가지고 있다는 것입니다 :0: unlocked
1: locked & no waiters
2: locked & waiters
나는 futexes가 현혹하는 것처럼 들리는 것을 들었습니다. 제대로 사용하는 것이 어렵습니다. 네가 이러는 이유가 있니? –
1 단락 참조 –
? pthread_mutex의 문제점은 무엇입니까? –