std::shared_lock<Mutex>::lock

来自cppreference.com
< cpp‎ | thread‎ | shared lock
 
 
并发支持库
线程
(C++11)
(C++20)
(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++11)
信号量
闩与屏障
(C++20)
(C++20)
未来体
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
(C++26)
风险指针





原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中弃用)
(C++11)(C++20 中弃用)
内存定序
原子操作的自由函数
原子标志的自由函数
 
 
void lock();
(C++14 起)

以共享模式锁定关联互斥体。相当于调用 mutex()->lock_shared()

参数

(无)

返回值

(无)

异常

  • mutex()->lock_shared() 抛出的任何异常。

示例

#include <iostream>
#include <mutex>
#include <shared_mutex>
#include <string>
#include <thread>
 
std::string file = "原始内容。"; // 模拟一个文件
std::mutex output_mutex; // 保护输出操作的互斥体。
std::shared_mutex file_mutex; // 读/写互斥体
 
void read_content(int id)
{
    std::string content;
    {
        std::shared_lock lock(file_mutex, std::defer_lock); // 先不锁定。
        lock.lock(); // 锁定它。
        content = file;
    }
    std::lock_guard lock(output_mutex);
    std::cout << "读者 #" << id << " 读取的内容: " << content << '\n';
}
 
void write_content()
{
    {
        std::lock_guard file_lock(file_mutex);
        file = "新内容";
    }
    std::lock_guard output_lock(output_mutex);
    std::cout << "已保存新内容。\n";
}
 
int main()
{
    std::cout << "两个读者读取文件。\n"
              << "一个写者与它们竞争。\n";
    std::thread reader1{read_content, 1};
    std::thread reader2{read_content, 2};
    std::thread writer{write_content};
    reader1.join();
    reader2.join();
    writer.join();
    std::cout << "已完成前几个文件操作。\n";
    reader1 = std::thread{read_content, 3};
    reader1.join();
}

可能的输出:

两个读者读取文件。
一个写者与它们竞争。
读者 #1 读取的内容: 原始内容。
读者 #2 读取的内容: 原始内容。
已保存新内容。
已完成前几个文件操作。
读者 #3 读取的内容: 新内容

参阅

尝试锁定关联的互斥体
(公开成员函数)
解锁关联的互斥体
(公开成员函数)