Подробности
[В начало]
Проблема в реализации № 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
[В начало]
»