linux pthread 运行 在指定时间的循环中(避免信号)
linux pthread running in a loop for specified time (avoiding signals)
你好我想做的是:
线程 (pthread.h) 需要在 while 循环中执行代码一段时间,该时间段将定义在 运行 时间
之后线程将正确完成最后一个循环并继续进行其他工作。
现在我正在使用信号:这是循环
setTimer(sec);
while(flag)
{
//do some work
}
// continue to run
并且我使用信号来调用将标志设置为 false 的函数:
void setTimer(int sec)
{
struct sigaction sa;
struct itimerval timer;
memset (&sa, 0, sizeof (sa));
sa.sa_handler = &alarm_end_of_loop; // this is the function to change flag to false
sigaction (SIGVTALRM, &sa, NULL);
timer.it_value.tv_sec = sec;
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
setitimer (ITIMER_REAL, &timer, NULL);
}
void alarm_end_of_loop()
{
flag = 0; //flag is global but only one thread will access it
}
我的问题是有没有办法避免使用信号?
似乎是超时模式。
double get_delta_time_to_now(const time_t timeout_time)
{
time_t now;
time(&now);
return difftime(now, timeout_time);
}
void do_it(int sec)
{
time_t timeout_time;
double diff;
time(&timeout_time);
timeout_time += sec; /* this is not necessarily correct */
diff = get_delta_time_to_now(timeout_time);
while (diff <= 0.0)
{
/* do your stuff */
diff = get_delta_time_to_now(timeout_time);
}
}
你好我想做的是:
线程 (pthread.h) 需要在 while 循环中执行代码一段时间,该时间段将定义在 运行 时间
之后线程将正确完成最后一个循环并继续进行其他工作。
现在我正在使用信号:这是循环
setTimer(sec);
while(flag)
{
//do some work
}
// continue to run
并且我使用信号来调用将标志设置为 false 的函数:
void setTimer(int sec)
{
struct sigaction sa;
struct itimerval timer;
memset (&sa, 0, sizeof (sa));
sa.sa_handler = &alarm_end_of_loop; // this is the function to change flag to false
sigaction (SIGVTALRM, &sa, NULL);
timer.it_value.tv_sec = sec;
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
setitimer (ITIMER_REAL, &timer, NULL);
}
void alarm_end_of_loop()
{
flag = 0; //flag is global but only one thread will access it
}
我的问题是有没有办法避免使用信号?
似乎是超时模式。
double get_delta_time_to_now(const time_t timeout_time)
{
time_t now;
time(&now);
return difftime(now, timeout_time);
}
void do_it(int sec)
{
time_t timeout_time;
double diff;
time(&timeout_time);
timeout_time += sec; /* this is not necessarily correct */
diff = get_delta_time_to_now(timeout_time);
while (diff <= 0.0)
{
/* do your stuff */
diff = get_delta_time_to_now(timeout_time);
}
}