Что произойдет, если потоку не удастся выполнить вызов pthread_mutex_lock ()? - PullRequest
0 голосов
/ 24 января 2011

Я делаю эксперимент, который, я думаю, является гарантированной тупиковой ситуацией:

void *thread_1(void *vptr)
{
    pthread_mutex_lock(&a);
    sleep(1);
    pthread_mutex_lock(&b);
    pthread_mutex_unlock(&b);
    pthread_mutex_unlock(&a);
}

void *thread_2(void *vptr)
{
    pthread_mutex_lock(&b);
    sleep(1);
    pthread_mutex_lock(&a);
    pthread_mutex_unlock(&a);
    pthread_mutex_unlock(&b);
}

Что произойдет, если поток не сможет заблокировать? Он попадает в очередь в ожидании мьютекса или просто переходит к следующей инструкции?

Ответы [ 3 ]

1 голос
/ 24 января 2011

В вашем случае оба потока будут навсегда приостановлены в ожидании мьютексов.Если вы запускаете оба потока одновременно.

Почему бы вам просто не создать взаимные исключения и потоки, а затем запустить свой пример?

1 голос
/ 24 января 2011

Если поток пытается заблокировать мьютекс, который уже заблокирован другим потоком, он будет приостановлен.В этом случае его выполнение не будет продолжено, пока он не получит блокировку.(Хотя «очереди» нет - просто неупорядоченный набор ожидающих потоков. Любой ожидающий поток может быть следующим, чтобы получить мьютекс).

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

0 голосов
/ 24 января 2011

Это зависит от причины, по которой он не может заблокироваться. Например, если поток уже удерживает блокировку, может быть возвращена ошибка. В любом случае вам следует проверить возвращаемое значение и проверить страницу справочника на наличие кодов ошибок, которые возвращаются в errno. Мои (Linux) состояния:

   The pthread_mutex_lock() function may fail if:

   EDEADLK
          The current thread already owns the mutex.
...