【发布时间】:2018-01-03 00:09:58
【问题描述】:
我在动态库中有一个逻辑,它运行主可执行文件所请求的某些服务。
从库代码调用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 期望的行为应该是主代码避免等待条件变量(如果它已经发出信号)。
【问题讨论】:
-
您可以使用初始计数为
0的信号量,因此main 被阻塞,直到start_service()将信号量计数增加到1。如果在main 中的块调用之前,start_service()增加信号量计数为1,main 永远不会进入等待状态。 -
嗨,感谢您的评论,这似乎是一种合适的方式..也许您可以修改我的代码来表达您的想法?
-
pthread_wait 必须始终在循环中使用,它具有等待的条件。不使用循环是不好的做法,随时可能失败。