Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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++ 函数pthread_rwlock_timedwrlock/timedrdlock与相对超时_C++_C_Pthreads - Fatal编程技术网

C++ 函数pthread_rwlock_timedwrlock/timedrdlock与相对超时

C++ 函数pthread_rwlock_timedwrlock/timedrdlock与相对超时,c++,c,pthreads,C++,C,Pthreads,我正在用C/C++为Solaris(Sparc)、AIX(PowerPC)和Red Hat Linux(x86_64)开发一个跨平台的应用程序,其中我们使用pthread库 我需要为读写器使用同步超时,因此我使用函数pthread\u rwlock\u timedwrlock/timedrdlock,因此必须使用绝对时间 这是我当前的实现,效果很好: bool nLec1Esc::close (unsigned int timeout){ struct timeval now;

我正在用C/C++为Solaris(Sparc)、AIX(PowerPC)和Red Hat Linux(x86_64)开发一个跨平台的应用程序,其中我们使用pthread库

我需要为读写器使用同步超时,因此我使用函数pthread\u rwlock\u timedwrlock/timedrdlock,因此必须使用绝对时间

这是我当前的实现,效果很好:

bool nLec1Esc::close (unsigned int timeout){
    struct timeval now;
    struct timespec strtimeout = {0};

    // Get the current time
    gettimeofday(&now,NULL);

    // Add time for timeout value
    strtimeout.tv_sec  = now.tv_sec;
    strtimeout.tv_nsec = (now.tv_usec+1000UL*timeout)*1000UL;           

    return (pthread_rwlock_timedwrlock(rwlock, &strtimeout) == 0);
}
我正试图改进实现,以提高性能,防止每次调用gettimeofday并使用固定的相对时间

我已经看到,Solaris函数pthread\u rwlock\u reltimedwrlock\u np使用相对超时值时可以使用该函数

您认为有什么方法可以改进此实现吗


提前感谢。

在POSIX标准或GNU/Linux实现中都没有reltimedwrlock。这是标准的一个已知缺陷。该缺点源于系统时间和“单调”时间之间的差异,而“单调”时间应用于I/O超时

POSIX并没有强制操作系统使用单调的计时器,所以pthread库并没有提供一种可靠的方法来设置wrlock wait操作的超时。您的方式也不可靠,因为如果系统时间发生变化,您的实现将挂起(有关详细信息,请参阅讨论)


我认为设置wrlock操作超时的最方便的方法是创建一个显式计时器(以您最喜欢的方式),从另一个线程或信号处理程序调用pthread\u rwlock\u destroy。

up!有用于linux实现的pthread\u rwlock\u reltimedwrlock\u np吗?