2012-02-23 4 views
0

뮤텍스 잠금을 구현하고 싶습니다. 나의 이해에서 는 mutex.lock()는 기다려야 신호일시 중지 pthread?

을 보내, 잠금이 소유하고있는 경우) 잠금 소유자 2를 확인) 1처럼 작동 큐 3) 다른 스레드 때까지이 스레드를 중단 대기에 실을 넣어한다 그러나, pthread_suspend()와 같은 것은 없지만, 어떻게하면 일시 중단합니까? 누군가 pthread_con_wait()을 사용하는 것으로 나타났습니다.하지만이 함수를 사용하려면 pthread_mutex 잠금을 먼저 설정해야합니다. 이는 내 mutex 내에서 pthread_mutex를 사용하는 것이 적합하지 않습니다.

글쎄, 만약 뮤텍스에 대한 나의 이해가 잘못 되었다면, 나를 바로 잡아주세요.

감사합니다.

답변

0

mutex.lock()처럼 작동한다 : 잠금이 소유 잠금을 소유하는 스레드가를 보낼 때까지 큐 3)이 스레드를 중단 대기에 실을 넣어 경우) 잠금 소유자 2를 확인)

1 웨이크 업 신호. 다른 스레드는 잠금을 해제 할 수 없습니다.

이 단계는 원자 적 연산으로 수행해야 뮤텍스를 획득/릴리스하는 모든 스레드에 대해 올바른 동작을 수행 할 수 있습니다. 이러한 호출은 다른 스레드에서 중단되고 다시 입력되는 방식에 관계없이 수행됩니다.

'그러나 pthread_suspend()와 비슷한 점이 없으면 어떻게 일시 중지합니까?' - 대개는 그렇지 않습니다. OS 커널은 실행되지 않아야하는 스레드를 차단할 수있는 동기화 기본 요소를 제공합니다.사용자 공간에서 '일시 중지'를 구현하려면 몇 가지 경우에 좋은 전략 인 스핀 대기 (잠깐 동안 만 잠금이 유지되는 언로드 된 멀티 코어 상자)가 가능하지만 확실히 모두가 아니라 (그리고 기계의 전체 클러스터를 가로 질러 극적으로 비참한 라이브 록으로 이어질 수 있음).

뮤텍스를 원한다면 OS 뮤텍스를 사용하십시오. 이것이 모든 크로스 플랫폼 lib입니다. 할 것이다.

+0

그런 다음 스핀 대기 확인 (스레드가 Q에 삽입 된 후)은 무엇입니까? 이거? "while (lockOwner! = self)"그러면 이것이 스핀 락과 다른 점은 무엇입니까? – user956159

0

당신은 최소한 당신이 가지고있는 가장 간단한 조각만큼만 복잡 할 수 있습니다. 이 가장 간단한 조각이 뮤텍스라면, 가지고있는 조각에서 뮤텍스를 만들 수 없습니다. 적어도 뮤텍스만큼 복잡한 것만 만들 수 있습니다. 뮤텍스보다 더 단순한 조각이 있다면, 그것들이 무엇인지 말해 주면 뮤텍스를 만드는 법을 알려줄 수 있습니다.

원하는 경우 pthread 뮤텍스와 조건 변수에서 자신 만의 뮤텍스를 만들 수 있습니다. 요점은 무엇인지 모르겠지만 그렇게하는 것은 쉽지 않습니다. 언급했듯이 pthread_cond_wait을 사용하여 자신 만의 뮤텍스를 기다릴 수 있습니다.

pthreads 표준이 뮤텍스를 제공하는 이유는 가능한 동기화 기본 요소 중 가장 유연한 부분이기 때문입니다.

2

뮤텍스, 잠금 및 대기 조건은 모두 다른 고유 한 것입니다. 은 잠금 및 대기 조건 인을 구현하기 위해 뮤텍스 변수가 필요합니다.

잠금은 잠금이 해제 될 때까지 하나의 스레드가 대기 할 때 한 번에 둘 이상의 스레드가 동일한 코드를 실행하지 못하도록하는 간단한 메커니즘입니다.

대기 조건은 스레드가 조건 (보통 부울 플래그)을 모니터하고 플래그가 호의적으로 변경된 경우에만 깨어나도록 허용하는 약간 더 복잡한 구조입니다.

두 경우 모두, 스레드가 블록 (즉, 휴면) 할 때, 운영 체제의 스케줄링 프리미티브는 스레드를 디 스케줄링하고 다른 곳에서 사용 가능한 컴퓨팅 시간을 자동으로 처리합니다. 스레드 및 작업 스케줄링은 일반적으로 수동으로 걱정해야하는 것이 아닙니다.