gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:07:53 24 4
gpt4 key购买 nike

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

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_cond_signal之前调用pthread_mutex_unlock

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

谢谢。

最佳答案

如果在互斥体解锁之前调用pthread_cond_signal,则可能会导致等待者(第一个示例中的“出队者”)立即醒来并尝试锁定互斥体在互斥体被信号线程解锁之前。因为您知道出列程序需要做的第一件事是锁定互斥体,所以您几乎鼓励了线程争用以及由此产生的(不必要的)上下文切换。

在发出信号之前解锁互斥体可以消除这种争用源。

关于java - 为什么在调用 `pthread_mutex_unlock` 之前调用 `pthread_cond_signal` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46762527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com