为什么在调用`pthread_cond_signal`之前调用`pthread_mutex_unlock`?

时间:2017-10-16 03:27:59

标签: java concurrency synchronization pthreads monitor

来自多处理器编程的艺术,

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 }

和Unix环境中的高级编程

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_unlock之前调用pthread_cond_signal

In Java, unlocking is called after calling signal. 那么为什么会有区别呢?

感谢。

1 个答案:

答案 0 :(得分:0)

如果在互斥锁解锁之前调用pthread_cond_signal,则会引入服务员(第一个示例中的'dequeuer')将立即唤醒并尝试锁定互斥锁之前的可能性。互斥锁由信令线程解锁。因为你知道dequeuer需要做的第一件事是锁定互斥锁,你几乎鼓励线程争用和结果(不必要的)上下文切换。

在信令之前解锁互斥锁消除了这种争用来源。