通过setitimer使用计时器时使用Sleep()

时间:2010-09-05 04:35:41

标签: c++ unix timer sleep

我通过sys / time.h中的setitimer函数在我的C ++代码中使用了一个计时器。这将SIGALRM信号映射到我的计时器处理程序方法。在此之后我无法使用睡眠功能。我假设这是因为睡眠也使用SIGALRM信号。你能为这个问题建议任何解决方法吗?

感谢您的回复。

3 个答案:

答案 0 :(得分:8)

来自alarm(2) man page

  

sleep()可以使用SIGALRM实现;混合调用alarm()sleep()是一个坏主意。

某些实现不使用SIGALRM,找到类似的机器并进行设置。否则,您可以尝试nanosleep();它安全地实施了。来自nanosleep(2) man page

  

sleep(3)usleep(3)相比,nanosleep()具有不影响任何信号的优势,它由POSIX标准化,提供更高的定时分辨率,并允许继续睡眠被信号更容易打断了。

答案 1 :(得分:3)

您可以尝试使用select()作为计时器。我不知道它是否使用SIGALRM,但它应该很容易测试。类似的东西:

   timeval t = {1, 0};

   select(0, NULL, NULL, NULL, &t);

答案 2 :(得分:0)

我使用的库为这些OS服务提供了抽象。我使用ACE库作为计时器和睡眠(ACE_OS::sleepACE_Reactor::schedule_timeout),它们一起工作没有任何问题。据我所知,ACE使用select作为其计时器。我猜boost::thread::sleepboost::asio::deadline_timer也可以成功完成任务。