gpt4 book ai didi

c - 来自多个线程的 pthread_cond_signal

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:24 24 4
gpt4 key购买 nike

让我们假设有一个线程调用 pthread_cond_wait 并等待信号:

   pthread_mutex_lock(&m);
.....
while(run)
{
do {
pthread_cond_wait(&cond,&m);
} while(!got_signal);
got_signal = false;
do_something();
}

并且有多个线程应该传递信号:

pthread_mutex_lock(&m);
got_signal = true;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&m);

这个解决方案足够安全吗?如果多个线程发送信号会发生什么? m mutex 是否足以保证所有信号被序列化并且不会丢失?

最佳答案

在您发布的代码中,唯一允许线程调用 pthread_cond_signal() 的地方是它们可以获取 m 的时候,而这只有在您等待时才会发生线程在 pthread_cond_wait() 上被阻塞。

但是,在等待线程被唤醒并可以获得互斥锁之前,两个发信号的线程可能会在彼此之后获取互斥锁。在那种情况下,您将丢失第二个信号(以及在此之后可能到达的任何其他信号,在等待线程运行之前),因为您的等待线程只能“看到”它已发出信号,但不知道它有多少次发生了。

为确保您不会丢失任何信号,您可以使用计数器代替 got_signal 标志:

等待线程:

pthread_mutex_lock(&m);
.....
while(run)
{
while(signal_count == 0) {
pthread_cond_wait(&cond,&m);
}
--signal_count;
do_something();
}

信号线程:

pthread_mutex_lock(&m);
++signal_count;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&m);

(另请注意,我已将 do...while 循环替换为 while 循环,以确保 pthread_cond_wait() 如果仍有未处理的信号,则不会调用。)

现在,如果多个线程最终直接发出信号,signal_count 将大于 1,这将导致等待线程运行其 do_something() 多个次而不是一次。

关于c - 来自多个线程的 pthread_cond_signal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29295280/

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