Namespaces
Variants

std::shared_mutex:: lock_shared

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
void lock_shared ( ) ;
(начиная с C++17)

Получает общее владение мьютексом. Если другой поток удерживает мьютекс в эксклюзивном владении, вызов lock_shared заблокирует выполнение до тех пор, пока не будет получено общее владение.

Если lock_shared вызывается потоком, который уже владеет mutex в любом режиме (эксклюзивном или общем), поведение не определено.

Если количество владельцев в совместном режиме уже превышает определенный реализацией максимум, lock_shared блокирует выполнение до тех пор, пока количество совместных владельцев не уменьшится. Гарантируется, что максимальное количество владельцев составляет не менее 10000.

Предыдущая операция unlock() на том же мьютексе синхронизируется-с (как определено в std::memory_order ) этой операцией.

Содержание

Параметры

(нет)

Возвращаемое значение

(нет)

Исключения

Выбрасывает std::system_error при возникновении ошибок, включая ошибки базовой операционной системы, которые могут помешать lock выполнить свои спецификации. Мьютекс не блокируется в случае выбрасывания любого исключения.

Примечания

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(); // блокировка вручную
        product = LAST;
        smtx.unlock();
    };
    auto reader = [&smtx, &product]()
    {
        int data = 0;
        std::vector<int> seen;
        do
        {
            {
                smtx.lock_shared(); // лучше использовать: 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

Смотрите также

блокирует мьютекс, ожидает если мьютекс недоступен
(public member function)
пытается заблокировать мьютекс для разделяемого владения, возвращает управление если мьютекс недоступен
(public member function)
разблокирует мьютекс (разделяемое владение)
(public member function)