日期:2014-05-16  浏览次数:20782 次

不用信号如何唤醒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呢,
------解决方案--------------------
引用:
一言难尽,没有逻辑,我找了半天也没找到,所以打算换一种方案。
对了,cond + mutex就得调用pthread_cond_timedwait函数了吧,我想问的是,

pthread_mutex_lock(&amp;mutex);
  while (flag) {
    printf(".\n");
    gettimeofday(&amp;now, N……

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。然后此函数才返回。
------解决方案--------------------
引用:
引用:一言难尽,没有逻辑,我找了半天也没找到,所以打算换一种方案。
对了,cond + mutex就得调用pthread_cond_timedwait函数了吧,我想问的是,

pthread_mutex_lock(&amp;amp;mutex);
  while (flag) {
    printf(".\n");
    ge……

上面写错了点。

while(oldy == y 
------解决方案--------------------
 ret == 0) {

改为
while(oldy == y && ret == 0) {

------解决方案--------------------
信号不方便也不可靠, 用条件变量解决吧。
------解决方案--------------------
引用:
如果整个过程要一直循环呢?就是说这次被唤醒之后,计时器重置,还要接着下一次同样的过程。因为y是一直变化的。


我代码都给出来了啊,