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

请教下linux中关于sleep()函数的问题
大家好,我现在想利用线程做一个定时器的小程序:
我的代码如下:
C/C++ code
#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

------解决方案--------------------
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退出后就没了,另一个线程却还在用它的地址(已经无效了)