不用信号如何唤醒sleep定时器
直奔主题吧:我现在主进程里面开了一个线程A,A的主要功能就是计时,当在规定的时间内睡醒后,检查主进程里面某个全局变量y有没有变化,执行相应的指令。如果在睡眠过程中,全局变量y发生了变化,则要唤醒A的计时,重新开始计时。我试过用信号,但是本进程里面有很多线程,出现了诡异的BUG。所以我想请教一下,有没有其他方法实现?
------解决方案--------------------pthread_kill
#include <pthread.h>
#include <signal.h>
int
pthread_kill(pthread_t thread, int sig);
------解决方案--------------------cond + mutex。
你这个逻辑简单,怎么会出现诡异的BUG呢,
------解决方案--------------------
volatile int y;
int oldy = y;
pthread_mutex_lock(&mutex);
while (flag) {
printf(".\n");
gettimeofday(&now, NULL);
outtime.tv_sec = now.tv_sec + 5;
outtime.tv_nsec = now.tv_usec * 1000;
int ret = 0;
while(oldy == y
------解决方案--------------------
ret == 0) {
ret = pthread_cond_timeout(&cond,&mutex,&outtime);
}
if(oldy != y) {
oldy = y;
//do something when y changed..
//如果这里的运行时间比较长,根据你的逻辑的具体要求,可能可以先unlock,再处理。然后再lock
} else if(oldy == y){
if(ret == ETIMEOUT) {
//do something when timeout and y is not changed.
} else {
//do something when error occurs
}
}
}
pthread_mutex_unlock(&mutex);
多线程,线程之间的运行是相互独立的。。A线程阻塞不会影响到B线程运行啊。
并且pthread_cond_timewait调用期间,mutex会被unlock, 当被B线程唤醒后,mutex会被lock。然后此函数才返回。
------解决方案--------------------
上面写错了点。
把
while(oldy == y
------解决方案--------------------
ret == 0) {
改为
while(oldy == y && ret == 0) {
------解决方案--------------------信号不方便也不可靠, 用条件变量解决吧。
------解决方案--------------------
我代码都给出来了啊,