# std::timed_mutex::lock

From cppreference.com
< cpp‎ | thread‎ | timed mutex

void lock(); |  | (since C++11)

Locks the mutex. If another thread has already locked the mutex, a call to `lock` will block execution until the lock is acquired.

If `lock` is called by a thread that already owns the `mutex`, the behavior is undefined: for example, the program may deadlock. An implementation that can detect the invalid usage is encouraged to throw a std::system_error with error condition `resource_deadlock_would_occur` instead of deadlocking.

Prior unlock() operations on the same mutex synchronize-with (as defined in std::memory_order) this operation.

### Parameters

(none)

### Return value

(none)

### Exceptions

Throws std::system_error when errors occur, including errors from the underlying operating system that would prevent `lock` from meeting its specifications. The mutex is not locked in the case of any exception being thrown.

### Notes

`lock()` is usually not called directly: std::unique_lock, `std::scoped_lock`, and std::lock_guard are used to manage exclusive locking.

### Example

This example shows how `lock` and `unlock` can be used to protect shared data.

Run this code

    #include <chrono>
    #include <iostream>
    #include <mutex>
    #include <thread>

    int g_num = 0; // protected by g_num_mutex
    std::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 output
            std::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: 1
    id: 1, g_num: 2
    id: 1, g_num: 3
    id: 0, g_num: 4
    id: 0, g_num: 5
    id: 1, g_num: 6

### See also

try_lock | tries to lock the mutex, returns if the mutex is not available (public member function)
try_lock_for | tries to lock the mutex, returns if the mutex has been unavailable for the specified timeout duration (public member function)
try_lock_until | tries to lock the mutex, returns if the mutex has been unavailable until specified time point has been reached (public member function)
unlock | unlocks the mutex (public member function)
C documentation for mtx_lock

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/thread/timed_mutex/lock&oldid=161286"