|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Exclusive locking | ||||
shared_timed_mutex::lock | ||||
| Shared locking | ||||
void lock(); | (since C++14) | |
Locks the mutex. If another thread has already locked the mutex, a call tolock will block execution until the lock is acquired.
Iflock is called by a thread that already owns themutex in any mode (shared or exclusive), the behavior is undefined.
Priorunlock() operations on the same mutexsynchronize-with (as defined instd::memory_order) this operation.
Contents |
Throwsstd::system_error when errors occur, including errors from the underlying operating system that would preventlock from meeting its specifications. The mutex is not locked in the case of any exception being thrown.
lock() is usually not called directly:std::unique_lock,std::scoped_lock, andstd::lock_guard are used to manage exclusive locking.
Shared mutexes do not support direct transition from shared to unique ownership mode: the shared lock has to be relinquished withunlock_shared() before exclusive ownership may be obtained withlock().boost::upgrade_mutex may be used for this purpose.
This example shows howlock andunlock can be used to protect shared data.
#include <chrono>#include <iostream>#include <mutex>#include <thread> int g_num=0;// protected by g_num_mutexstd::mutex g_num_mutex; void slow_increment(int id){for(int i=0; i<3;++i){ g_num_mutex.lock();++g_num;// note, that the mutex also syncronizes the outputstd::cout<<"id: "<< id<<", g_num: "<< g_num<<'\n'; g_num_mutex.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(234));}} int main(){std::thread t1{slow_increment,0};std::thread t2{slow_increment,1}; t1.join(); t2.join();}
Possible output:
id: 0, g_num: 1id: 1, g_num: 2id: 1, g_num: 3id: 0, g_num: 4id: 0, g_num: 5id: 1, g_num: 6
| tries to lock the mutex, returns if the mutex is not available (public member function)[edit] | |
| unlocks the mutex (public member function)[edit] | |
C documentation formtx_lock | |