gpt4 book ai didi

linux - pthread_cond_timedwait 提前一秒返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:50 24 4
gpt4 key购买 nike

下面的程序产生这个输出:

$ ./test_condvar 9000
1343868189.623067126 1343868198.623067126 FIRST
1343868197.623132345 1343868206.623132345 TIMEOUT
1343868205.623190120 1343868214.623190120 TIMEOUT
1343868213.623248184 1343868222.623248184 TIMEOUT
1343868221.623311549 1343868230.623311549 TIMEOUT
1343868229.623369718 1343868238.623369718 TIMEOUT
1343868237.623428856 1343868246.623428856 TIMEOUT

请注意,跨行读取显示预期的 9 秒的时间增量,但向下读取列显示 pthread_cond_timedwait 在 8 秒内返回 ETIMEDOUT。

pthread 库是 glibc 2.12。运行红帽 EL6。 uname -a 显示 2.6.32-131.12.1.el6.x86_64 #1 SMP Tue Aug 23 11:13:45 CDT 2011 x86_64 x86_64 x86_64 GNU/Linux

看起来 pthread_cond_timedwait 依赖于 lll_futex_timed_wait 的超时行为。

关于在其他地方寻找解释的任何想法?

#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

int main ( int argc, char *argv[] )
{
pthread_mutexattr_t mtx_attr;
pthread_mutex_t mtx;
pthread_condattr_t cond_attr;
pthread_cond_t cond;

int milliseconds;
const char *res = "FIRST";

if ( argc < 2 )
{
fputs ( "must specify interval in milliseconds", stderr );
exit ( EXIT_FAILURE );
}

milliseconds = atoi ( argv[1] );

pthread_mutexattr_init ( &mtx_attr );
pthread_mutexattr_settype ( &mtx_attr, PTHREAD_MUTEX_NORMAL );
pthread_mutexattr_setpshared ( &mtx_attr, PTHREAD_PROCESS_PRIVATE );

pthread_mutex_init ( &mtx, &mtx_attr );
pthread_mutexattr_destroy ( &mtx_attr );

#ifdef USE_CONDATTR
pthread_condattr_init ( &cond_attr );
if ( pthread_condattr_setclock ( &cond_attr, CLOCK_REALTIME ) != 0 )
{
fputs ( "pthread_condattr_setclock failed", stderr );
exit ( EXIT_FAILURE );
}

pthread_cond_init ( &cond, &cond_attr );
pthread_condattr_destroy ( &cond_attr );
#else
pthread_cond_init ( &cond, NULL );
#endif

for (;;)
{
struct timespec now, ts;
clock_gettime ( CLOCK_REALTIME, &now );

ts.tv_sec = now.tv_sec + milliseconds / 1000;
ts.tv_nsec = now.tv_nsec + (milliseconds % 1000) * 1000000;
if (ts.tv_nsec > 1000000000)
{
ts.tv_nsec -= 1000000000;
++ts.tv_sec;
}

printf ( "%ld.%09ld %ld.%09ld %s\n", now.tv_sec, now.tv_nsec,
ts.tv_sec, ts.tv_nsec, res );

pthread_mutex_lock ( &mtx );
if ( pthread_cond_timedwait ( &cond, &mtx, &ts ) == ETIMEDOUT )
res = "TIMEOUT";
else
res = "OTHER";
pthread_mutex_unlock ( &mtx );
}
}

最佳答案

有一个Linux kernel bug由今年 7 月 1 日插入闰秒触发,这导致 futexes 过早一秒过期,直到机器重新启动或您运行解决方法:

# date -s "`date`"

听起来你已经被那个咬伤了。

关于linux - pthread_cond_timedwait 提前一秒返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11769687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com