ожидайте и уведомьте в общей памяти C/C++

Как ожидать и уведомить как в Java В C/C++ для общей памяти между два или больше, распараллеливают? Я пользуюсь pthread библиотекой.

33
задан Sajad Bahmani 8 November 2013 в 08:24
поделиться

4 ответа

Вместо объекта Java, который вы будете использовать для ожидания/уведомления, вам понадобятся два объекта: мьютекс и переменная условий. Они инициализируются с помощью pthread_mutex_init и pthread_cond_init.

Где бы вы синхронизировались на объекте Java, используйте pthread_mutex_lock и pthread_mutex_unlock (обратите внимание, что в языке C вы должны самостоятельно выполнить их сопряжение). Если вам не нужно ждать/уведомление, просто заблокируйте/разблокируйте, то вам не нужна переменная условия, а только мьютекс. Имейте в виду, что мьютексы не обязательно являются "рекурсивными", это означает, что если вы уже держите блокировку, вы не сможете принять ее снова, если не установите флаг init, чтобы сказать, что вы хотите такого поведения.

Где вы бы вызвали java.lang.Object.wait, вызовите pthread_cond_wait или pthread_cond_timedwait.

Где вы бы вызвали java.lang.Object.notify, вызовите pthread_cond_signal.

Где вы бы вызвали java.lang.Object.notifyAll, вызовите pthread_cond_broadcast.

Как и в Java, поддельные пробуждения возможны из функций ожидания, поэтому необходимо некоторое условие, которое устанавливается перед вызовом сигнала к сигналу, и проверяется после вызова к ожиданию, а в цикле нужно вызывать pthread_cond_wait. Как и в Java, мьютекс освобождается в ожидании.

В отличие от Java, где вы не можете позвонить уведомить , пока вы не удержите монитор, вы можете на самом деле позвонить pthread_cond_signal, не удерживая мьютекс. Обычно это ничего не дает и часто является действительно плохой идеей (потому что обычно вы хотите заблокировать - установить условие - сигнал - разблокировать). Так что лучше просто игнорировать его и относиться к нему как к Java.

На самом деле это не так уж и много, основной шаблон тот же самый, что и Java, и не случайно. Однако, прочитайте документацию по всем этим функциям, потому что есть различные флаги и забавные поведения, о которых Вы хотите знать и/или которых Вы избегаете.

В C++ вы можете сделать немного лучше, чем просто использовать pthreads API. Вы должны, по крайней мере, применять RAII к блокировке/разблокировке мьютекса, но в зависимости от того, какие библиотеки C++ Вы можете использовать, Вам, возможно, будет лучше использовать для функций pthreads больше обёртки C++.

36
ответ дан 27 November 2019 в 18:19
поделиться

pthread_cond_wait и pthread_cond_signal можно использовать для синхронизации на основе состояния

6
ответ дан 27 November 2019 в 18:19
поделиться

Если доступно, вы можете использовать SEMAPHORS POSIX. Библиотека Pthread имеет Mutexes, которые могут работать для вас.

1
ответ дан 27 November 2019 в 18:19
поделиться

Использование переменных состояния - это один из способов сделать это: те, которые доступны при использовании библиотеки Pthread под Linux (см. Ссылку).

Переменная состояния является переменной Введите pthread_cond_t и используется с соответствующие функции для ожидания А позже продолжение процесса.

4
ответ дан 27 November 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: