Что произойдет, если я вернусь из функции без вызова pthread_mutex_unlock? - PullRequest
1 голос
/ 23 января 2011

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

pthread_mutex_lock(&wfg);
//and then I return from the function
return 0;

Мьютекс останется заблокированным?

Ответы [ 2 ]

7 голосов
/ 23 января 2011

Мьютекс остается заблокированным до тех пор, пока pthread_mutex_unlock не будет вызван из потока, который получил блокировку. Функции не имеют к этому никакого отношения. Вы могли бы иметь что-то вроде

pthread_mutex_t wfg;
...
void razzle()
{
   pthread_mutex_lock(&wfg);
}

void dazzle()
{
  pthread_mutex_unlock(&wfg);
}

...
razzle();
... do stuff ...
dazzle();

И это было бы хорошо (но глупо).

6 голосов
/ 23 января 2011

Да, он остается заблокированным, и следующий человек, который попытается заблокировать его, не сможет этого сделать. Кто-то другой (в том же потоке) может впоследствии разблокировать его где-то еще, но трудно проверить правильность вашей программы, когда сбор и выпуск разделены и, следовательно, несколько подвержены ошибкам. Valgrind включает инструмент, который может помочь отследить проблемы, подобные этой и другим, более тонким.

В C ++ это идеальное время для рассмотрения RAII

...