2014-10-06 321 views
1

我正在开发一个应用程序跨平台的C/C++ for Solaris(Sparc),AIX(PowerPC)和Red Hat Linux(x86_64),我们在其中使用pthread库。函数pthread_rwlock_timedwrlock/timedrdlock具有相对超时

我需要使用同步超时的读者/作家,所以我使用函数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,使用相对超时值。

您是否看到过改进此实现的方法?

在此先感谢。

+0

up!任何用于linux实现的pthread_rwlock_reltimedwrlock_np? – 2015-01-15 13:45:03

回答

1

在POSIX标准或GNU/Linux实现中,没有像reltimedwrlock那样的东西。这是该标准的已知缺点。缺点在于系统时间和应该用于I/O超时的“单调”时间之间的差异。

POSIX不会强制操作系统具有单调计时器,所以pthread库不提供设置wrlock等待操作超时的可靠方法。你的方式也是不可靠的,因为如果系统时间发生变化,你的实现会挂起(有关详细信息,请参见this讨论)。

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