gpt4 book ai didi

c++ - 在不锁定互斥锁的情况下调用 pthread_cond_signal

转载 作者:IT老高 更新时间:2023-10-28 12:04:36 26 4
gpt4 key购买 nike

我在某处读到我们应该在调用 pthread_cond_signal 之前锁定 mutex 并在调用之后解锁互斥锁:

The pthread_cond_signal() routine isused to signal (or wake up) anotherthread which is waiting on thecondition variable. It should becalled after mutex is locked, and mustunlock mutex in order forpthread_cond_wait() routine tocomplete.

我的问题是:在不锁定互斥体的情况下调用 pthread_cond_signalpthread_cond_broadcast 方法是否可以?

最佳答案

如果您未在更改条件和信号的代码路径中锁定互斥锁,您可能会丢失唤醒。考虑这对过程:

流程 A:

pthread_mutex_lock(&mutex);
while (condition == FALSE)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);

流程 B(不正确):

condition = TRUE;
pthread_cond_signal(&cond);

然后考虑这种可能的指令交错,其中 conditionFALSE 开始:

Process A                             Process B

pthread_mutex_lock(&mutex);
while (condition == FALSE)

condition = TRUE;
pthread_cond_signal(&cond);

pthread_cond_wait(&cond, &mutex);

condition 现在是 TRUE,但进程 A 卡在等待条件变量 - 它错过了唤醒信号。如果我们改变进程 B 来锁定互斥锁:

流程 B(正确):

pthread_mutex_lock(&mutex);
condition = TRUE;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

...那么上述情况不会发生;唤醒永远不会错过。

(请注意,您可以实际上将 pthread_cond_signal() 本身移动到 pthread_mutex_unlock() 之后,但这会导致不太理想的调度线程,并且由于条件本身的更改,您必然已经在此代码路径中锁定了互斥锁)。

关于c++ - 在不锁定互斥锁的情况下调用 pthread_cond_signal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4544234/

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