2017-10-16 14 views
0

, `pthread_cond_signal`을 호출하기 전에`pthread_mutex_unlock`이 호출되는 이유는 무엇입니까? 다중 프로그래밍의 예술에서

1 #include <pthread.h> 
2 #define QSIZE 16 
3 typedef struct { 
4  int buf[QSIZE]; 
5  long head, tail; 
6  pthread_mutex_t *mutex; 
7  pthread_cond_t *notFull, *notEmpty; 
8 } queue; 
9 void queue_enq(queue* q, int item) { 
10  // lock object 
11  pthread_mutex_lock (q->mutex); 
12  // wait while full 
13  while (q->tail - q->head == QSIZE) { 
14   pthread_cond_wait (q->notFull, q->mutex); 
15  } 
16  q->buf[q->tail % QSIZE] = item; 
17  q->tail++; 
18  // release lock 
19  pthread_mutex_unlock (q->mutex); 
20  // inform waiting dequeuers 
21  pthread_cond_signal (q->notEmpty); 
22 } 

와 유닉스 환경

void 
enqueue_msg(struct msg *mp) 
{ 

    pthread_mutex_lock(&qlock); 
    mp->m_next = workq; 
    workq = mp; 
    pthread_mutex_unlock(&qlock); 
    pthread_cond_signal(&qready); 

} 

왜 고급 프로그래밍에서

pthread_mutex_unlockpthread_cond_signal를 호출하기 전에이라고?

In Java, unlocking is called after calling signal. 왜 차이가 있습니까?

감사합니다.

+0

내가 잘못 생각합니다. https://stackoverflow.com/questions/4544234/calling-pthread-cond-signal-without-locking-mutex –

+0

@ JerryJeremiah 감사합니다. APUE에는 신호 이전에 잠금을 해제하는 예제가 있습니다. 내 업데이트를 참조하십시오. – Ben

답변

1

pthread_cond_signal 경우 뮤텍스의 잠금이 해제되기 전에, 당신이 웨이터 (첫 번째 예제에서 'dequeuer이') 즉시 깨어 뮤텍스 전에 뮤텍스 을 잠글 시도에 의해 잠금 해제 할 가능성을 소개 호출했다 신호 스레드. dequeuer가해야할 첫 번째 작업은 뮤텍스를 잠그는 것임을 알고 있기 때문에 스레드 경합과 결과적인 (불필요한) 컨텍스트 전환을 거의 권장합니다.

시그널링 전에 뮤텍스를 잠금 해제하면이 경쟁 소스가 제거됩니다.

+0

감사합니다. Java에서 주문이 왜 반대입니까? – Ben

+0

@Ben 주문은 java에서 "역순"되지 않습니다. 프로그래머 인 당신은 Java 또는 pthreads에서 이들을 호출 할 순서를 결정합니다. 안전한 것은 뮤텍스가 보관 될 때 신호를 보내는 것입니다. 뮤텍스가없는 상태에서 호출하려는 경우 조건에 신호가 누락되지 않도록 코드 분석을 철저히 수행하거나 논리를 작성하여 코드를 수행해야합니다. 조건 신호가 누락 되더라도 상관 없습니다. – nos

+0

@nos : 감사합니다. 여기 pthread 예제에서 조건에 신호가 누락되는 것을 방지하기위한 보장이 있습니까? pthread와 Java의 예제는 모두 같은 책에서 나온 것입니다 : 다중 프로세서 프로그래밍의 기술 (Art of Multiprocessor Programming). – Ben