函数pthread_rwlock_timedwrlock/timedrdlock具有相对超时

Function pthread_rwlock_timedwrlock/timedrdlock with relative time-out

本文关键字:相对 timedrdlock 超时 pthread rwlock timedwrlock 函数      更新时间:2023-10-16

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

我需要为读写器使用同步超时,所以我使用函数pthread_rwlock_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_rwlock_reltimedwrlock_np,使用相对超时值。

你认为有什么方法可以改进这个实施吗?

提前谢谢。

在POSIX标准或GNU/Linux实现中都没有reltimedwrlock这样的东西。这是该标准的一个已知缺点。该缺点源于系统时间和I/O超时所使用的"单调"时间之间的差异。

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

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