Подробности

[В начало]

Проблема в реализации № S0501

Краткое описание

Функция pthread_mutex_trylock() возвращает EDEADLK вместо EBUSY

Подробное описание

Функция pthread_mutex_trylock() пытается установить блокировку мьютекса. Она должна вернуть EBUSY, если мьютекс не может быть получен, так он уже заблокирован. Но в glibc 2.4-2.5 функция возвращает EDEADLK, если мьютекс на момент вызова функции уже был захвачен текущим потоком управления.

Раздел стандарта

Linux Standard Base Core Specification 3.1, Chapter 13. Base Libraries, 13.10. Data Definitions for libpthread pthread_mutex_trylock() function

Пример

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>

int printResAsErrno( int res, const char * funcWithArgs ) {
    printf( "%s is %d ( %s )\n", funcWithArgs, res, strerror( res ) );
    return res;
}

#define callPrintResAsErrno( funcWithPars ) printResAsErrno( funcWithPars, #funcWithPars )

int main( int argc, char ** argv ) {
    pthread_mutexattr_t attr;
    pthread_mutex_t mutex;
    // prepare attr and mutex
    callPrintResAsErrno( pthread_mutexattr_init( & attr )                              );
    callPrintResAsErrno( pthread_mutexattr_settype( & attr, PTHREAD_MUTEX_ERRORCHECK ) );
    callPrintResAsErrno( pthread_mutex_init( & mutex, & attr )                         );
    callPrintResAsErrno( pthread_mutex_lock( & mutex )                                 );
    // find error
    if ( callPrintResAsErrno( pthread_mutex_trylock( & mutex ) ) != EBUSY ) {
        // error found
        printf( "error : pthread_mutex_trylock( ... ) should be %d ('%s')\n", EBUSY, strerror( EBUSY ) );
    } else {
        // error not found
        printf( "no error\n" );
    }
    // destroy attr
    callPrintResAsErrno( pthread_mutexattr_destroy( & attr ) );
    // destroy mutex
    callPrintResAsErrno( pthread_mutex_unlock( & mutex )  );
    callPrintResAsErrno( pthread_mutex_destroy( & mutex ) );
    return 0;
}

Компонент

glibc 2.4-2.5

Статус

Исправлено в glibc 2.6

[В начало]