命名空间
变体
操作

std::shared_mutex::lock_shared

来自 cppreference.cn
< cpp‎ | thread‎ | shared mutex
 
 
并发支持库
线程
(C++11)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
协作取消
互斥
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩锁和屏障
(C++20)
(C++20)
期物
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
Hazard 指针
原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中已弃用)
(C++11)(C++20 中已弃用)
内存顺序
(C++11)(C++26 中已弃用)
原子操作的自由函数
原子标志的自由函数
 
 
void lock_shared();
(自 C++17 起)

获取互斥量的共享所有权。如果另一个线程以独占所有权持有互斥量,则对 lock_shared 的调用将阻塞执行,直到可以获取共享所有权。

如果线程在任何模式(独占或共享)下已拥有 mutex,则调用 lock_shared 的行为是未定义的。

如果超过实现定义的最大共享所有者数量已在共享模式下锁定互斥量,则 lock_shared 会阻塞执行,直到共享所有者的数量减少。保证最大所有者数量至少为 10000。

在同一互斥量上的先前 unlock() 操作与此操作同步(如 std::memory_order 中定义)。

目录

[编辑] 参数

(无)

[编辑] 返回值

(无)

[编辑] 异常

当发生错误时,包括来自底层操作系统的错误(这些错误会阻止 lock 满足其规范)时,抛出 std::system_error。在抛出任何异常的情况下,互斥锁不会被锁定。

[编辑] 注释

lock_shared() 通常不直接调用:std::shared_lock 用于管理共享锁定。

[编辑] 示例

#include <chrono>
#include <iostream>
#include <mutex>
#include <shared_mutex>
#include <syncstream>
#include <thread>
#include <vector>
 
std::mutex stream_mutx;
void print(auto v)
{
    std::unique_lock<std::mutex> lock(stream_mutx);
    std::cout << std::this_thread::get_id() << " saw: ";
    for (auto e : v)
        std::cout << e << ' ';
    std::cout << '\n';
}
 
int main()
{
    using namespace std::chrono_literals;
    constexpr int N_READERS = 5;
    constexpr int LAST = -999;
 
    std::shared_mutex smtx;
    int product = 0;
 
    auto writer = [&smtx, &product](int start, int end)
    {
        for (int i = start; i < end; ++i)
        {
            auto data = i;            
            {
                std::unique_lock<std::shared_mutex> lock(smtx);
                product = data;
            } 
            std::this_thread::sleep_for(3ms);
        }
 
        smtx.lock(); // lock manually
        product = LAST;
        smtx.unlock();
    };
 
    auto reader = [&smtx, &product]()
    {
        int data = 0;
        std::vector<int> seen;
        do
        {
            {
                smtx.lock_shared(); // better to use: std::shared_lock lock(smtx);
                data = product;
                smtx.unlock_shared();
            }                                   
 
            seen.push_back(data);
            std::this_thread::sleep_for(2ms);
        }
        while (data != LAST);
 
        print(seen);
    };
 
    std::vector<std::thread> threads;
    threads.emplace_back(writer, 1, 13);
    threads.emplace_back(writer, 42, 52);
 
    for (int i = 0; i < N_READERS; ++i)
        threads.emplace_back(reader);
 
    for (auto&& t : threads)
        t.join();
}

可能的输出

127755840 saw: 43 3 3 4 46 5 6 7 7 8 9 51 10 11 11 12 -999
144541248 saw: 2 44 3 4 46 5 6 7 7 8 9 51 10 11 11 12 -999
110970432 saw: 42 2 3 45 4 5 47 6 7 8 8 9 10 11 11 12 -999
119363136 saw: 42 2 3 4 46 5 6 7 7 8 9 9 10 11 11 12 12 -999
136148544 saw: 2 44 3 4 46 5 6 48 7 8 9 51 10 11 11 12 12 -999

[编辑] 参见

锁定互斥锁,如果互斥锁不可用则阻塞
(公共成员函数) [编辑]
尝试锁定互斥锁以进行共享所有权,如果互斥锁不可用则返回
(公共成员函数) [编辑]
解锁互斥锁(共享所有权)
(公共成员函数) [编辑]