如果没有其他线程使用变量标志,这是一种安全的方法来确保主线程永远不会错过唤醒信号吗?
void *Cancel_master_thread(void *arg)
{
while (1)
{
flag = 0;
pthread_mutex_lock(&cancel_in_progress);
flag = 1;
pthread_cond_wait(&cancel_finished, &cancel_in_progress);
pthread_mutex_unlock(&cancel_in_progress);
}
}
void *Cancel_slave_MB()
{
while (1)
{
while (flag != 1)
{
}
pthread_mutex_lock(&cancel_in_progress);
pthread_cond_signal(&cancel_finished);
pthread_mutex_unlock(&cancel_in_progress);
}
}
答案 0 :(得分:0)
更改主服务器的标志后,必须生成处理器,以便主服务器可以执行。 (通常。这里有很多关于线程和多处理器的讨论。)所以你想要进行某种阻塞调用(比如睡眠),这样主人就可以运行了。目前,您已经在紧密循环中运行Cancel_slave_MB,因此没有其他任何机会可以运行。
编辑所以你的例子有点勉强。如果设置断点或printf(在锁定区域之外),它们是否正确执行?我想说不要永远循环,这就是信号量的重点。
答案 1 :(得分:0)
如果您的缩进是cancel_master_thread()
从pthread_cond_wait()
(pthread_cond_signal()
- 循环中)cancel_slave_MB()
只执行一个while
,那么请执行此操作以下方式:
void * cancel_master_thread(void *arg)
{
pthread_mutex_lock(&cancel_in_progress);
while (1)
{
pthread_cond_wait(&cancel_finished, &cancel_in_progress);
/* do something per signal received */
}
pthread_mutex_unlock(&cancel_in_progress);
}
void * cancel_slave_MB()
{
while (1)
{
/* do something */
pthread_mutex_lock(&cancel_in_progress);
pthread_cond_signal(&cancel_finished);
pthread_mutex_unlock(&cancel_in_progress);
}
}