Приветствую!
Собственно хотел услышать несколько слов об особенностях применения функции pthread_mutex_timedlock. В моём приложении эта функция никогда не выходит с таймаутом. Вот пример использования:
Объявления переменных:
pthread_mutexattr_t m_MutexAttributes;
pthread_mutex_t m_Mutex;
Создание мутанта:
pthread_mutexattr_init( &m_MutexAttributes );
// Мьютекс будет действовать внутри одного процесса
// ( в принципе так должно быть и по умолчанию)
pthread_mutexattr_setpshared(&m_MutexAttributes, PTHREAD_PROCESS_PRIVATE);
// Мьютекс будет рекурсивный
pthread_mutexattr_settype( &m_MutexAttributes, PTHREAD_MUTEX_RECURSIVE );
pthread_mutex_init ( &m_Mutex, &m_MutexAttributes );
Ожидание (timeout — параметр функции, микросекунды):
int iRes = 0;
if ( timeout == infinite )
{
iRes = pthread_mutex_lock( &m_Mutex );
}
else
{
timespec tim;
clock_gettime( CLOCK_REALTIME, &tim );
unsigned long lsec = timeout / ONE_SECOND;
tim.tv_sec += lsec;
// Проблема с потенциальным переполнением поля tv_nsec
// существует, но в данном случае не проявляется, так как
// timeout в тесте - целое число секунд.
tim.tv_nsec += (timeout % ONE_SECOND) * 1000;
iRes = pthread_mutex_timedlock(&m_Mutex, &tim);
}
Проблема заключается в том, что выделенная болдом строка
никогда не вываливается
по таймауту. В момент вызова мутант стопудово занят другим потоком (это и есть суть теста).
Вопрос в том, что мне нужно сделать, чтобы я вывалился по таймауту?
Среда: Mandrake Linux на двухпроцессорной машине (Intel)