Я разрабатываю приложение для встроенной ОС Linux (uClinux), и мне нужно иметь возможность блокировать мьютекс более одного раза (одним и тем же потоком).
У меня есть мьютекс и мьютексаттр, определенные и инициализированные следующим образом:
pthread_mutexattr_t waiting_barcode_mutexattr;
pthread_mutex_t waiting_barcode_mutex;
pthread_mutexattr_init(&waiting_barcode_mutexattr);
pthread_mutexattr_settype(&waiting_barcode_mutexattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&waiting_barcode_mutex, &waiting_barcode_mutexattr);
Но когда я пытаюсь получить блокировку дважды, она блокируется на второй блокировке:
pthread_mutex_lock(&waiting_barcode_mutex);
pthread_mutex_lock(&waiting_barcode_mutex);
Я неправильно инициализирую или есть лучший способ сделать то же самое?
Заранее спасибо.
Выводы:
- По-видимому, PTHREAD_MUTEX_RECURSIVE или PTHREAD_MUTEX_RECURSIVE_NP не работают, поэтому я не могу создать реентерабельный мьютекс.
- try_lock тоже никуда не годится. Он получает блокировку, если может, и возвращает ошибку, если не может получить блокировку. К сожалению, ошибка просто сообщает мне, что мьютекс уже используется, и я не могу узнать, владеет ли уже текущий поток блокировкой или нет.
- pthread_mutex_lock может вернуть ошибку, если текущий поток имеет блокировку, но для этого мне нужно создать мьютекс типа PTHREAD_MUTEX_ERRORCHECK, а я тоже не могу его создать.