Ответ 1
Нет, не может. Эта функциональность была предложена комитету под названием upgrade_mutex
и upgrade_lock
, но комитет решил отклонить эту часть предложения. В настоящее время не проводится никакой работы, чтобы повторно использовать эту функциональность.
Edit
В ответ на вопрос "куда идти отсюда" отредактируйте в user3761401 вопрос, я создал частично искалеченную реализацию upgrade_mutex/upgrade_lock
здесь:
https://github.com/HowardHinnant/upgrade_mutex
Не стесняйтесь использовать это. Он находится в общественном достоянии. Он только слегка протестирован и не обладает полной функциональностью, описанной в N3427. В частности, отсутствуют следующие функции:
- Невозможно преобразовать
unique_lock
вshared_timed_lock
. - Невозможно выполнить попытку или время-преобразовать a
shared_timed_lock
вunique_lock
. - Невозможно выполнить попытку или timed-преобразовать a
upgrade_lock
вunique_lock
.
Сказав это, я включил эту функцию в upgrade_mutex
, и ее можно получить на этом низком уровне очень уродливо (такие примеры приведены в main.cpp).
Доступны другие преобразования блокировок, указанные в N3427.
- выбор времени и времени от
shared_timed_lock
доupgrade_lock
. - от
upgrade_lock
доshared_timed_lock
. - блокировка преобразования от
upgrade_lock
доunique_lock
. - от
unique_lock
доupgrade_lock
.
Все было помещено в namespace acme
. Поместите его в любое пространство имен, которое вы хотите.
Требования
Компилятор должен поддерживать "rvalue-this" квалификаторы и явные операторы преобразования.
Отказ
Код был только слегка протестирован. Если вы найдете ошибки, я был бы признателен за запрос на перенос.
Можно оптимизировать upgrade_mutex
с помощью std::atomic
. На этом фронте не было предпринято никаких усилий (это сложная задача с ошибкой, которая занимает больше времени, чем у меня на данный момент).