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

Posted

技术标签:

【中文标题】在c中暂停posix线程特定时间间隔的问题【英文标题】:Issue in pausing the posix thread for specific time interval in c 【发布时间】:2010-08-20 08:35:53 【问题描述】:

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

【问题讨论】:

您能否将崩溃的回溯添加到您的问题中 是时间问题还是段错误?你能澄清这一点吗?例如,移除睡眠并持续调用 updateValue 是否会导致段错误。 崩溃更可能出现在 updateValue() 函数中,而不是您显示的线程函数中。 省略的参数名在C++中有效;它在标准 C 中无效。 【参考方案1】:

在 POSIX 系统(Linux 是)上,nanosleep 适合这种睡眠:

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

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

【讨论】:

【参考方案2】:

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

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

我最初的答案是使用选择技巧,但让我们停止推广不良代码

回到问题的根源,你怎么知道你的分段错误来自睡眠代码? 您是否获得了可以回溯的核心转储?

【讨论】:

哎呀,好久没看到那个hack了。不,不要那样做,使用nanosleep 另请注意,nanosleep() 可以在 errno 设置为 EINTR 的指定时间之前返回。如果这样不行,需要在设置mytimeout = remaining后继续nanosleeping(循环)。

以上是关于在c中暂停posix线程特定时间间隔的问题的主要内容,如果未能解决你的问题,请参考以下文章

识别微秒范围内的 POSIX 读取暂停

Java多线程程序休眠暂停与停止

为啥我要启动一个“暂停”的线程?

Java ExecutorService 暂停/恢复特定线程

在 C 语言中使用 POSIX 在多个进程(不是线程,仅进程)之间共享二进制信号量

OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?