У меня следующая проблема с PTHREAD_MUTEX_RECURSIVE: он блокируется, когда мьютекс заблокирован из другого потока;
pthread_mutex_t m;
pthread_mutexattr_t ma;
void* exec_th(void* arg) {
printf("THREAD %p before LOCK\n", pthread_self());
//second mutex lock
pthread_mutex_lock(&m);
printf("THREAD %p after LOCK\n", pthread_self());
pthread_mutex_unlock(&m);
printf("THREAD %p after UNLOCK\n", pthread_self());
return (void*)0;
}
int main() {
pthread_mutexattr_init(&ma);
pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&m, &ma);
// first mutex lock
pthread_mutex_lock(&m);
// create a thread that will call the same mutex
pthread_t t;
pthread_create(&t, NULL, exec_th, NULL);
sleep(1); //just to see the console
pthread_mutex_unlock(&m);
}
OpenGroup сообщает:
Поток, пытающийся заблокировать этот мьютекс без предварительной разблокировки
удастся заблокировать мьютекс. Блокировка блокировки, которая может
произойти с мьютексами типа PTHREAD_MUTEX_NORMAL не может произойти с этим
тип мьютекса
Тем не менее, приведенный выше код генерирует такое же поведение для PTHREAD_MUTEX_RECURSIVE и PTHREAD_MUTEX_NORMAL:
- только до LOCK печатается перед сном () в main ();
- поток блокирует мьютекс после его освобождения функцией main ();
Любая помощь очень ценится, спасибо.