我必须在单独的线程中调用一个方法(我正在使用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)
答案 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
是您的线程过早中断时剩余的时间。