Хотя это старая ветка (пост, что угодно), я натолкнулся на уникальный подход к блокировке против MutEx, который выгоден при определенных обстоятельствах.
Если ваши коллизии с несколькими объектами, желающими получить доступ, нечасты, рассмотритеследующий подход:
- Получить, с блокировкой (ями) (MutEx (s) ... что угодно), копии соответствующих данных
- Убедитесь, что хотя бы один из скопированных элементовдостаточно сравнить с оригиналом, чтобы определить, произошло ли изменение
- Снять блокировку (и)
- Выполнить манипуляции с копиями, сохраняяСтабильно ваш элемент сравнения
- Снова получите блокировку (и)
- Сравните ваш эталонный элемент с его оригиналом, чтобы определить, произошло ли изменение
- Если нет, примените вашрезультаты, если так, откажитесь от своих результатов, повторно приобретите копии и начните сначала
Например:
- Блокировка текущего и сберегательного счета;приобретать копии как остатков, так и времени последних операций;unlock
- Рассчитать изменения ... например, перевести 5 $ с накоплений на проверку
- Снова заблокировать учетные записи;сравнивайте фактические и ваши копии времени транзакции - если они совпадают, применяйте рассчитанные значения и разблокируйте, если нет, повторно приобретайте, разблокируйте и перезапускайте
Идея состоит в том, что если есть какие-либодействия, которые также должны блокироваться, но не влияют на результат вашего кода (по общему признанию, пример не подходит для этого случая), вы не препятствовали выполнению этого кода другим.
Для этого существует какое-то оборудование, ноэто больше не является «основным направлением»: IBM System 370 имела атомарную инструкцию сравнения и обновления только для этой ситуации.