std::shared_mutex::lock
STD::共享[医]互斥::锁
void lock( | | (since C++17) |
---|
锁定互斥物。如果另一个线程已经锁定互斥对象,则调用lock
将阻止执行,直到获得锁为止。
如果lock
由已经拥有mutex
在任何模式%28共享或独占%29中,行为都是未定义的。
优先unlock()
对同一个互斥体的操作同步性
中定义的28名ASstd::memory_order
%29这次行动。
参数
%280%29
返回值
%280%29
例外
抛出std::system_error
当发生错误时,包括来自底层操作系统的错误,这些错误将防止lock
不符合它的规格。在抛出任何异常的情况下,互斥锁不会被锁定。
注记
lock()
通常不直接调用:std::unique_lock
和std::lock_guard
用于管理独占锁定。
共享互斥不支持从共享模式到唯一所有权模式的直接转换:共享锁必须用unlock_shared()
在获得独家所有权之前lock()
...助推::升级[医]互斥可用于此目的。
例
这个例子显示了如何lock
和unlock
可用于保护共享数据。
二次
#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
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;
std::cout << id << " => " << g_num << '\n';
g_num_mutex.unlock(
std::this_thread::sleep_for(std::chrono::seconds(1)
}
}
int main()
{
std::thread t1(slow_increment, 0
std::thread t2(slow_increment, 1
t1.join(
t2.join(
}
二次
可能的产出:
二次
0 => 1
1 => 2
0 => 3
1 => 4
0 => 5
1 => 6
二次
另见
try_lock | tries to lock the mutex, returns if the mutex is not available (public member function) |
---|---|
unlock | unlocks the mutex (public member function) |
c MTX文件[医]锁
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。