Есть ли способ выполнить секцию кода в ожидании блокировки мьютекса?Процесс во время ожидания блокировки мьютекса
Единственным истинным внутренним ударом для моего приложения является взаимодействие с базой данных, и есть моменты, когда мне нужна строгая синхронизация, которая из-за взаимодействия с базой данных может вызвать конфликт, поэтому я хотел бы использовать время ожидания блокировки получить данные из базы данных.
Например, я хотел бы код, чтобы выглядеть примерно так, в псевдо:
boost::unique_lock<boost::mutex> process_lock(process_mutex, work_while_contending);
//code to execute while lock contending
process_lock.proceed_after_lock();
Я рассмотрел подталкивание-х synchronization section, и в то время как futures
и recursive
звук, как мое намерение может быть достигнуто, но я не может понять, как реализовать свои намерения.
Как можно реализовать мои намерения?
Async заставляет работу выполнять в другом потоке. При вызове get() этот поток блокируется до тех пор, пока не закончится асинхронный поток. Итак, это еще один поток, который выполняет эту работу. Исходный поток просто «запустил async, дождитесь mutex, дождитесь async». – SoapBox
Очень хороший момент о голоде с подходом 'try_lock'. В то время как надменные муфтеки не гарантируют, что голодание ничьей не будет происходить при нормальном использовании, вероятность этого должна быть увеличена в этом случае. Тем не менее, если основной целью здесь является повышение производительности, накладные расходы на разворачивание отдельного рабочего потока для каждого вызова могут устранить любые реальные выигрыши в этом случае. Это действительно зависит от того, насколько тяжелым является соперничество, сколько времени удерживаются блокировки и как долго выполняется эта задача ожидания, какой подход в этом случае более уместен. –