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