请教下linux中关于sleep()函数的问题

sno_guo 2012-08-23 08:24:27
大家好,我现在想利用线程做一个定时器的小程序:
我的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

typedef void (*timeoutCallBack)(void);
struct timerStruct{
int time_ms;
timeoutCallBack timeoutcallback;
};

typedef struct timerStruct timer_t2;

int timerStartFlag;
void *timer_thread(void *arg)
{
timer_t2 *timeArg=(timer_t2*)arg;
int time=timeArg->time_ms;
time*=1000;
printf("flag is %d\n",timerStartFlag);
while(timerStartFlag)
{
usleep(time);
if(timeArg->timeoutcallback)
timeArg->timeoutcallback();

}
}

void timerStop()
{
timerStartFlag=0;
}


void createTimer(int time_ms,void(*callback)(void))
{
timer_t2 timeArg;
timeArg.time_ms=time_ms;
timeArg.timeoutcallback=callback;
pthread_t timeid;
timerStartFlag=1;
pthread_create(&timeid, NULL, &timer_thread, (void *)&timeArg);
}

void timeoutProc(void)
{
printf("timeout\n");
}

int main(void)
{
int i;
createTimer(100,timeoutProc);
while(1)
{
for(i=0;i<10000000;i++); ///只是为了测试
//sleep(10); /// 为什么这里使用了sleep(10);,定时器就死掉了,
}
return 0;
}



问题是:我在子线程中使用usleep(),然后在主线程中也用睡眠函数sleep()的时候,这时程序就死掉了,请问下为什么!

我的编译命令是: gcc timer.c -o timer -lpthread
...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sno_guo 2012-08-24
  • 打赏
  • 举报
回复
哦,谢谢了,是的是的,低级错误,接贴!
ByteYeah 2012-08-24
  • 打赏
  • 举报
回复
void createTimer(int time_ms,void(*callback)(void))
{
timer_t2 timeArg;
timeArg.time_ms=time_ms;
timeArg.timeoutcallback=callback;
pthread_t timeid;
timerStartFlag=1;
pthread_create(&timeid, NULL, &timer_thread, (void *)&timeArg);
}

timeArg是局部变量,createTimer退出后就没了,另一个线程却还在用它的地址(已经无效了)
sno_guo 2012-08-24
  • 打赏
  • 举报
回复
哦,谢谢,你的意思是:我在使用pthread_create创建一个子线程后,
如果在主线程中使用sleep()这个函数的时候,主线程就会间歇性的退出,
这样子线程就找不到我传过去的函数地址,从而导致非法操作内存, 是吧?!!
谢谢回复!
qq120848369 2012-08-23
  • 打赏
  • 举报
回复
另外:

Interactions between usleep() and any of the following are unspecified:

nanosleep()
setitimer()
timer_create()
timer_delete()
timer_getoverrun()
timer_gettime()
timer_settime()
ualarm()
sleep()
qq120848369 2012-08-23
  • 打赏
  • 举报
回复
create函数将函数栈上变量地址传递给一个线程去用,等create函数退出变量回收了,线程函数就非法操作内存了。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧