The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"pthread_mutex_unlock(нелоченного мьютекса) "
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"pthread_mutex_unlock(нелоченного мьютекса) "  
Сообщение от devcoder (ok) on 02-Фев-09, 11:02 
Столкнулся _возможно_ с багом функции pthread_mutex_unlock().
Вот код:


/*
* Compile:
*    cc -Wall -O0 -g -ggdb -c -o pthunlk.o pthunlk.c
*    cc -lpthread pthunlk.o -o pthunlk
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>

static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

int main(int argc, char *argv[])
{
   int err;

   /* unlock without lock */
   err = pthread_mutex_unlock(&lock);
   if (err != 0 )
      fprintf(stderr, "mutex_unlock() failed -> errno #%d (%s)\n", err, strerror(err));

   err = pthread_mutex_destroy(&lock);
   if ( err != 0 ) {
      fprintf(stderr, "mutex_destroy() failed -> errno #%d (%s)\n", err, strerror(err));
   }

   exit(EXIT_SUCCESS);
}

$ ./pthunlk
mutex_destroy() failed -> errno #16 (Device or resource busy)

$ getconf GNU_LIBC_VERSION
glibc 2.3.6
$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.3.6

Самое интересное, если между unlock() и destroy() вызвать lock()/trylock(),
то destroy() не сообщает ошибок.

Если бы мьютекс был бы рекурсивным, можно было бы предположить
что проблема в знаковом счётчике блокировок,
но мьютекс-то обычный.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "pthread_mutex_unlock(нелоченного мьютекса) "  
Сообщение от Аноним (??) on 02-Фев-09, 12:06 
>Если бы мьютекс был бы рекурсивным, можно было бы предположить
>что проблема в знаковом счётчике блокировок,
>но мьютекс-то обычный.

Обычный, потому и не проверяет ошибки.

If the mutex type is PTHREAD_MUTEX_NORMAL, deadlock detection shall not be provided. Attempting to relock the mutex causes  deadlock. If a thread attempts to unlock a mutex that it has not locked or a mutex which is unlocked, undefined behavior results.

Хочешь проверки — пользуйся PTHREAD_MUTEX_ERRORCHECK

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру