Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在执行sem_timedwait时,我将如何应对系统时间的变化?_C_Unix_Semaphore - Fatal编程技术网

C 在执行sem_timedwait时,我将如何应对系统时间的变化?

C 在执行sem_timedwait时,我将如何应对系统时间的变化?,c,unix,semaphore,C,Unix,Semaphore,假设我有一个使用sem\u timedwait等待100毫秒的程序(获取当前时间,添加100毫秒,将结果用作abs\u timeout)。现在,在等待信号量时,系统时间由外部进程(ntp)设置 如果我们运气不好,系统时间设置为过去的2天。这将导致sem\u timedwait等待2天和100毫秒 有没有办法解决这个问题?您可以使用条件变量,并选择单调时钟作为参考时钟。信号量有点老派,我会避免在新的应用程序中使用它们。如果愿意,可以使用条件变量和互斥体轻松实现信号量 pthread_condatt

假设我有一个使用
sem\u timedwait
等待100毫秒的程序(获取当前时间,添加100毫秒,将结果用作
abs\u timeout
)。现在,在等待信号量时,系统时间由外部进程(ntp)设置

如果我们运气不好,系统时间设置为过去的2天。这将导致
sem\u timedwait
等待2天和100毫秒


有没有办法解决这个问题?

您可以使用条件变量,并选择单调时钟作为参考时钟。信号量有点老派,我会避免在新的应用程序中使用它们。如果愿意,可以使用条件变量和互斥体轻松实现信号量

pthread_condattr_t cattr;
pthread_condattr_init(&cattr);
pthread_condattr_setclock(&cattr, CLOCK_MONOTONIC);

pthread_cond_t cond;
pthread_cond_init(&cond, &cattr);

struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
ts.tv_nsec += 100000000;
if (ts.tv_nsec >= 1000000000) {
    ts.tv_nsec -= 1000000000;
    ts.tv_sec += 1;
}
int r = pthread_cond_timedwait(&cond, &mutex, &ts);
if (r == ETIMEDOUT) {
    // ...
} else {
    // ...
}
单调时钟“不受系统时间不连续跳跃的影响”(),因此它正是这种应用所需要的

你说

现在,在等待信号量时,系统时间由外部进程(ntp)设置


但情况比这更糟。。。在调用
clock\u gettime()
之后,但在调用
sem\u timedwait()
之前,可能会调整系统时钟。。。据它所知,您希望
sem_timedwait()
等待两天。

如果将系统时间设置为过去的两天,那就太糟糕了。特别是如果它一直处于NTP管理之下。的确,将系统时间同步到一个可靠的来源是避免此类问题的一个好方法。@JohnBollinger:虽然避免不连续的跳跃会很好,但现实并不允许我们这么容易做到这一点。并不是所有的Unix系统都是联网的,也不是所有的系统都有精确的实时时钟,甚至有些系统根本没有实时时钟。这就是为什么我们的时钟毕竟是单调的。@johnbollinger:事实上,我们谈论的不是个人电脑,而是带有无缓冲时钟的嵌入式设备和所有那些糟糕的东西。。