Вместо объекта 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, где вы не можете вызвать notify
, если вы не держите монитор, вы можете фактически вызвать pthread_cond_signal
, не удерживая мьютекс. Однако обычно он ничего не дает и часто является очень плохой идеей (потому что обычно вы хотите заблокировать - установить условие - сигнал - разблокировать). Поэтому лучше просто игнорировать это и относиться к нему как к Java.
На самом деле ничего особенного нет, основной шаблон такой же, как у Java, и не случайно. Тем не менее, прочитайте документацию по всем этим функциям, потому что есть различные флаги и забавные поведения, о которых вы хотите знать и / или избегать.
В C ++ вы можете сделать немного лучше, чем просто с помощью API pthreads. Вы должны по крайней мере применить RAII к блокировке / разблокировке мьютекса, но в зависимости от того, какие библиотеки C ++ вы можете использовать, вам может быть лучше использовать более обёртку C ++ - ish для функций pthreads.