Как я могу реализовать синхронизацию (мониторы), подобную Java, с помощью Win32 API?

#multithreading #winapi #mutex #monitor #condition-variable

Вопрос:

Каждый объект Java (и его класс) имеет связанный монитор. В терминах pthread монитор Java эквивалентен комбинации возвращаемого мьютекса и переменной условия.

Для блокировки Win32 API предоставляет объекты мьютекса (которые являются реентерабельными, но тяжелыми) и Критические разделы (которые не являются реентерабельными, но легкими). Он также предоставляет другие конструкции синхронизации, такие как семафоры и события, но не имеет явного понятия переменной условия.

Если бы я писал JVM, как бы я мог использовать эти концепции Win32 для реализации мониторов Java?

Ответ №1:

В Windows есть функция SignalObjectAndWait (), которую можно использовать очень похоже на ожидание переменной состояния в мониторе. Вы можете использовать событие (то есть Сброс) и Мьютекс, а затем использовать PulseEvent (), чтобы выполнить эквивалент сигнализации переменной условия.

Комментарии:

1. И SignalObjectAndWait, и PulseEvent ненадежны. При определенных условиях они не работают. SignalObjectAndWait не гарантирует, что он будет атомарным. PulseEvent не работает, если в это время происходят вызовы APC ядра. Сочетание как SignalObjectAndWait, так и PulseEvent может привести к катастрофическим последствиям.

Ответ №2:

Я предлагаю вам взглянуть на исходный код OpenJDK, чтобы увидеть, как был реализован класс ReentrantLock.

(Я сам не проверял, поэтому не уверен в ответе).

блокировки util.concurrent реализованы с использованием собственного API.

Комментарии:

1. В Windows он реализован с использованием собственного API, а не мониторов Java.

2. Я изо всех сил пытаюсь найти соответствующий исходный код. Не могли бы вы указать мне правильное направление?