根据《多处理器编程的艺术》,
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.
那么为什么有区别呢?
谢谢。
最佳答案
如果在互斥锁解锁之前要调用pthread_cond_signal
,则可能会导致服务员(在第一个示例中为“出队列器”)立即醒来并尝试锁定互斥锁,然后再通过信号线程将互斥锁解锁。因为您知道出队程序要做的第一件事就是锁定互斥锁,所以您几乎鼓励线程争用和结果(不必要的)上下文切换。
在发信号之前解锁互斥锁可以消除这种争用源。