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

在c中将posix线程暂停特定时间间隔的问题,c,linux,pthreads,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,threadEntr

我必须在单独的线程中调用一个方法(我使用的是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)

正确的做法是使用nanosleep,因为usleep和sleep可能会干扰SIGALARM,而nanosleep是专门为线程设计的:

struct timespec mytimeout = {
    .tv_sec = 5,
    .tv_usec = 0,
};
struct timespec remaining;
nanosleep(&mytimeout, &remaining);
我最初的答案是使用选择技巧,但让我们停止推广糟糕的代码

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

在POSIX系统上(linux是什么?
nanosleep
对于这种睡眠来说是正确的:

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

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

您可以将崩溃的回溯添加到问题中吗?是时间问题还是SEGFULT问题?你能澄清这一点吗?例如,删除睡眠并不断调用UpDeaValueE导致Sebug。崩溃更可能在您所显示的线程函数中的UpDebug评估()函数中。C++中省略的参数名有效;这在标准C中是无效的。哦,很长一段时间我没有看到那个黑客。不,不要这样做,请使用
nanosleep
。还要注意
nanosleep()
可以在指定时间之前返回
errno
设置为
EINTR
。如果这不正常,则需要在设置
mytimeout=remaining
(在循环中)后继续nanosleeping。