gpt4 book ai didi

c++ - 如何避免等待信号已发送的 pthread_cond_t

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

我在动态库中有一个逻辑,它运行主可执行文件请求的一些服务。

从库代码调用start_service 后,需要在服务就绪之前进行一些准备,在此期间,主代码不应尝试访问该服务。

为了在服务准备就绪时通知主要代码,我使用条件变量并向主要可执行文件发出信号。

我想听听一些关于处理库在主代码等待条件变量之前变得可用的情况的最佳方法的建议。在这种情况下,等待可以永远持续......

这是服务代码:

extern pthread_cond_t cnd;
extern pthread_mutex_t mtx;

void start_service()
{
// getting serviceable.
pthread_cond_signal(&cnd);
main_loop();
}

这是主要代码。

pthread_cond_t cnd;
pthread_mutex_t mtx;

int main()
{
pthread_cond_init(&cnd,NULL);
pthread_mutex_init(&mtx, NULL);

std::thread mytrd(&start_service);
...
pthread_mutex_lock(&mtx);

pthread_cond_wait(&cnd, &mtx); // what happens if we get here after the signal already sent.
pthread_mutex_unlock(&mtx);
...
}

P.S 期望的行为应该是主代码避免等待条件变量,如果它已经发出信号。

最佳答案

您需要一个谓词并将 wait 包含在对谓词的检查中:

    pthread_mutex_lock(&mtx);
while( ! predicate ) pthread_cond_wait(&cnd, &mtx);
pthread_mutex_unlock(&mtx);

这样,线程就不会在不需要的时候开始等待。您需要它的第二个原因是为了避免可能发生的虚假唤醒,即 pthread_cond_wait 可能会返回,即使其他线程没有发出条件信号。

然后另一个线程必须做(您需要锁定互斥量以保护谓词):

 pthread_lock_mutex(&mtx);
predicate = true;
pthread_cond_signal(&cnd);
pthread_unlock_mutex(&mtx);

关于c++ - 如何避免等待信号已发送的 pthread_cond_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45347802/

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