PTHREAD_MUTEX_RECURSIVE блокирует во втором потоке - PullRequest
0 голосов
/ 02 мая 2018

У меня следующая проблема с 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 ();

Любая помощь очень ценится, спасибо.

1 Ответ

0 голосов
/ 02 мая 2018

блокируется, когда мьютекс заблокирован из другого потока

Если мьютекс является рекурсивным, и поток, который вызывает pthread_mutex_lock, уже содержит этот мьютекс, только тогда он немедленно вернется. В вашем случае поток main блокирует мьютекс, а другой поток пытается получить тот мьютекс, который блокируется, потому что он удерживается другим. Это нормальное поведение.

Если любой поток может разблокировать любой (рекурсивный) мьютекс, удерживаемый другим потоком (ами), то рекурсивные мьютексы будут бесполезны!

См. Также документацию POSIX .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...