gpt4 book ai didi

C - 保证 condvars 已准备好发送信号

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

我有一个与不同硬件接口(interface)的简单应用程序。对于每个硬件,我针对一个独特的监视器函数生成了一个 pthread_t,总共有 6 个线程:1 个管理线程和 5 个工作线程。

每个线程都有一个共同的初始化例程,它等待管理器线程通过以下方式唤醒它:

pthread_mutex_lock(&mMutex);
pthread_cond_wait(&mMutex, &condVar);
pthread_mutex_lock(&mMutex);

然后主线程通过一次向一个线程发送信号来唤醒所有线程:

pthread_cond_wait(&mMutex1, &condVar1);
pthread_cond_wait(&mMutex2, &condVar2);
...
pthread_cond_wait(&mMutex5, &condVar5);

代码实际上工作正常,但这是因为我很幸运能把握时机。当主/管理线程发出 pthread_cond_signal 时,线程尚未完成初始化的可能性很小但确实存在。我需要找到一种方法来保证每个条件变量都有一个由其各自的工作线程对其进行的 wait 调用。

我总是可以创建一个在相应的互斥体中设置的状态 bool 值,但我不能在一条指令中原子地同时执行 setwait 操作,到目前为止我所知。我也可以使用 pthread_barrier_t,但这只能保证所有线程在进行各自的 wait 调用之前都是一条或两条指令。

是否有一种经过验证的方法可以确定 wait 调用已经完成,或者我是否需要采用某种定时等待循环/检查的方法?

谢谢。

最佳答案

I could always create a status boolean that is set within the corresponding mutex, but I cannot atomically do both the set and the wait operation in one instruction, so far as I know.

这是正确的做法——您可以以原子方式执行设置和等待操作,因为条件变量与互斥锁交互的方式。当您执行 pthread_cond_wait() 操作时,您必须锁定您传入的互斥锁。如果您在执行 pthread_cond_signal() 时相应地锁定了相同的互斥锁,则等待线程不会唤醒,直到信号线程解锁互斥锁。

所以,下面的代码会做你想做的事:

// Flag indicating if the worker thread is waiting or not
bool waiting = false;
...

// Worker thread code
... do stuff ...
while (!condition_is_not_satisfied())
{
pthread_mutex_lock(&mutex);
waiting = true;
pthread_cond_wait(&cond, &mutex);
waiting = false;
pthread_mutex_unlock(&mutex);
}
...

// Signalling thread code
pthread_mutex_lock(&mutex);
if (waiting)
{
// Worker thread is waiting -- signal it to wake up
pthread_cond_signal(&cond);
}
else
{
// Worker thread has not yet entered the wait state -- do something else
}
pthread_mutex_unlock(&mutex);

关于C - 保证 condvars 已准备好发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22104864/

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