在c中暂停posix线程特定时间间隔的问题

时间:2010-08-20 08:35:53

标签: c linux pthreads

我必须在单独的线程中调用一个方法(我正在使用posix线程),它会在每5秒后更新一些值,并在下面编写代码。

void *threadEntry(void *)
{
  while(1)
  {
    updateValue();//to update some values
    usleep(5000000);//pause for 5 second
   }
}
pthread_t thread1;
pthread_create(&thread1,NULL,threadEntry,NULL);

但是这个帖子在4-5分钟后会出现分段错误。可能是什么原因?还有其他方法可以暂停posix线程。(我正在使用linux)

2 个答案:

答案 0 :(得分:1)

正确的做法是使用nanosleep,因为睡眠和睡眠可能会使SIGALARM陷入困境,而nanosleep则专门设计了线程:

struct timespec mytimeout = {
    .tv_sec = 5,
    .tv_usec = 0,
};
struct timespec remaining;
nanosleep(&mytimeout, &remaining);

我原来的答案是使用精选技巧,但让我们停止推广不良代码

回到问题的根源,您如何知道您的分段错误来自睡眠代码? 你有没有获得核心转储,你可以回溯吗?

答案 1 :(得分:1)

在POSIX系统上(linux是)nanosleep对于这样的睡眠是正确的:

int nanosleep(const struct timespec *req, struct timespec *rem);

其中req是您的请求,rem是您的线程过早中断时剩余的时间。