在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线程特定时间间隔的问题的主要内容,如果未能解决你的问题,请参考以下文章
Java ExecutorService 暂停/恢复特定线程