pthread_cond_timedwait返回EINVAL

最近发现程序的business.wait(100); 使用起来造成cpu负载很高

代码如下:

    struct timespec delay;
    if ( !clock_gettime(CLOCK_REALTIME,&delay) )
    {
        delay.tv_sec += (int)(waitmillsseconds / 1000);
        delay.tv_nsec += (waitmillsseconds % 1000)*1000000;
    }
    int err = pthread_cond_timedwait(&cond, &lock, &delay); // err会一直返回EINVAL

后来打印发现出现错误时:

clock_gettime tv_sec=1409711645, tv_nsec=1087094042; // 这里面的tv_nsec的值超过了10的9次方  也就是超过了1秒
errno 22 is EINVAL

后来修改:

    delay.tv_sec += (int)(waitmillsseconds / 1000);
    delay.tv_nsec += (waitmillsseconds % 1000)*1000000;
    if (delay.tv_nsec > 1000000000) {
	delay.tv_sec += 1;
	delay.tv_nsec -= 1000000000;
    }
这样修改后就没有问题了

你可能感兴趣的:(EINVAL)