Должна ли блокировка удерживаться при сигнализации условной переменной? - PullRequest
1 голос
/ 01 марта 2020

OK. Здесь приведен пример использования pthread lib в c.

. В учебнике я обнаружил следующий код:

//for thread 2
pthread_mutex_lock(&lock);
should_wake_up = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);

Этот код работает довольно хорошо. Мне просто интересно, будет ли работать следующий код?

//for thread 2
pthread_mutex_lock(&lock);
should_wake_up = 1;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);//signal the conditional variable but the lock is not held

Какие плюсы и минусы для следующего кода?

PS. Предположим, что сотрудничающий поток имеет код:

//for thread 1
pthread_mutex_lock(&lock);
while(!should_wake_up)
    pthread_cond_wait(&cond, &lock);
pthead_mutex_unlock(&lock);

PS2. Я столкнулся с другим вопросом, который указывает на то, что если мы не хотим, чтобы сигнал был потерян, мы должны использовать блокировку, чтобы убедиться, что связанный предикат (в данном случае - should_wake_up) не может быть изменен, когда блокировка удерживается в поток 1. В этом случае, похоже, это не проблема. Ссылка на пост: [1]: сигнал по условной переменной без удержания блокировки . Я думаю, его проблема в том, что он забыл о блокировке. Но мой вопрос другой.

1 Ответ

2 голосов
/ 03 марта 2020

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

Мьютекс защищает общее состояние (в данном случае флаг should_wake_up). При условии, что мьютекс заблокирован при изменении общего состояния и при проверке общего состояния, pthread_cond_signal может быть вызван без блокировки мьютекса, и все будет работать так, как ожидалось.

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

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