О функции pthread_mutex_timedlock
От: McQwerty Россия  
Дата: 18.02.05 10:13
Оценка:
Приветствую!

Собственно хотел услышать несколько слов об особенностях применения функции 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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.