No, it can not. That functionality was proposed to the committee under the name upgrade_mutex
and upgrade_lock
, but the committee chose to reject that portion of the proposal. There is currently no work under way to re-prepose that functionality.
Edit
In response to the “where to go from here” edit in user3761401’s question, I’ve created a partially crippled implementation of upgrade_mutex/upgrade_lock
here:
https://github.com/HowardHinnant/upgrade_mutex
Feel free to use this. It is in the public domain. It is only lightly tested, and it does not have the full functionality described in N3427. Specifically the following functionality is missing:
- One can not convert a
unique_lock
to ashared_timed_lock
. - One can not try- or timed-convert a
shared_timed_lock
to aunique_lock
. - One can not try- or timed-convert a
upgrade_lock
to aunique_lock
.
That being said, I’ve included this functionality in upgrade_mutex
and it can be accessed at this low level in a very ugly manner (such examples are in main.cpp).
The other lock conversions mentioned in N3427 are available.
- try- and timed-conversions from
shared_timed_lock
toupgrade_lock
. - conversion from
upgrade_lock
toshared_timed_lock
. - blocking conversion from
upgrade_lock
tounique_lock
. - conversion from
unique_lock
toupgrade_lock
.
It has all been put in namespace acme
. Put it in whatever namespace you want.
Requirements
The compiler needs to support “rvalue-this” qualifiers, and explicit conversion operators.
Disclaimers
The code has been only lightly tested. If you find bugs I would appreciate a pull request.
It is possible to optimize the upgrade_mutex
through the use of std::atomic
. No effort has been done on that front (it is a difficult and error prone task, taking more time than I have at the moment).