不幸的是cygwin的GCC 4.5.3並行線程庫實現不支持POSIX標準函數cygwin的pthread_mutex_timedlock替代
int pthread_mutex_timedlock(pthread_mutex_t* mutex, struct timespec* abstime);
有沒有人一個好主意,如何實現一個很好的解決方法在一個互斥體包裝類此方法?可能會使用pthread_mutex_trylock()
(基於毫秒)nanosleep()
調用? 我沒有對後者的想法感覺不錯,但不管怎麼說,C++實現看起來是這樣的:
bool MyPosixMutexWrapper::try_lock(const TimeDuration<>& timeout)
{
if(valid)
{
if(timeout == TimeDuration<>::Zero)
{
if(pthread_mutex_trylock(&mutexHandle) == 0)
{
return true;
}
}
else
{
struct timespec now;
clock_gettime(CLOCK_REALTIME,&now);
TimeDuration<> tnow(now);
tnow += timeout;
struct timespec until = tnow.getNativeValue();
#if defined(_POSIX_TIMEOUTS)
if(pthread_mutex_timedlock(&mutexHandle,&until) == 0)
{
return true;
}
#else
long milliseconds = timeout.milliseconds();
while(milliseconds > 0)
{
if(pthread_mutex_trylock(&mutexHandle) == 0)
{
return true;
}
struct timespec interval;
struct timespec remaining;
interval.tv_sec = 0;
interval.tv_nsec = 1000000;
do
{
remaining.tv_sec = 0;
remaining.tv_nsec = 0;
if(nanosleep(&interval,&remaining) < 0)
{
if(errno == EINTR)
{
interval.tv_sec = remaining.tv_sec;
interval.tv_nsec = remaining.tv_nsec;
}
else
{
return false;
}
}
clock_gettime(CLOCK_REALTIME,&now);
tnow = TimeDuration<>(now);
if(tnow >= TimeDuration(until))
{
return pthread_mutex_trylock(&mutexHandle) == 0;
}
} while(remaining.tv_sec > 0 || remaining.tv_nsec > 0);
--milliseconds;
}
#endif
}
}
return pthread_mutex_trylock(&mutexHandle) == 0;
}
有誰有這個代碼的一個更好的主意或改進措施?
您可以使用Windows互斥鎖代替pthread互斥鎖,並在適當的超時時間內使用'WaitForSingleObject'。但是Windows互斥體非常霸道,需要針對所有情況的系統調用,甚至是無可爭議的鎖定,所以除了必須編寫所有新代碼來處理它們之外,您可能會遇到性能問題。 –
@AdamRosenfield:我希望有一個'POSIX兼容'的實現,'_POSIX_TIMEOUTS'指示'pthread_mutex_timedlock()'函數是否可用。我不想在此代碼中使用Windows本機解決方案。 –
由於我已經害怕,所提議的實現在Cygwin環境下不能很好地工作。儘管我已經改進了代碼來檢查超時... –