У меня есть класс, который используется несколькими проектами, некоторые его применения являются однопоточными, а некоторые - многопоточными. Однопоточные пользователи не хотят накладных расходов на мьютекс-блокировку, а многопоточные пользователи не хотят делать свою собственную блокировку и хотят иметь возможность работать в «однопоточном режиме». Поэтому я хотел бы иметь возможность выбирать между реальными и "фиктивными" мьютексами во время выполнения.
В идеале я бы имел shared_ptr<something>
и назначил бы реальный или фальшивый объект мьютекса. Я бы тогда "запер" это безотносительно к тому, что в нем.
unique_lock<something> guard(*mutex);
... critical section ...
Сейчас существует signals2::dummy_mutex
, но он не имеет общего базового класса с boost::mutex
.
Итак, каков элегантный способ выбора между реальным мьютексом и фиктивным мьютексом (либо в сигналах2, либо чем-то еще), не делая код блокировки / защиты более сложным, чем в примере выше?
И, прежде чем указать на альтернативы:
- Я мог бы выбрать реализацию во время компиляции, но макросы препроцессора уродливы, и поддержание конфигураций проекта нам больно.
- Пользователи класса в многопоточной среде не хотят брать на себя ответственность за блокировку использования класса, а не за то, чтобы класс делал свою собственную блокировку внутри.
- Слишком много API-интерфейсов и существующих способов использования для "поточно-ориентированной оболочки", чтобы быть практическим решением.