std::shared_mutex::lock
void lock(); | (с C++17) |
Получает эксклюзивное владение shared_mutex. Если другой поток держит эксклюзивную блокировку или общую блокировку на том же shared_mutex, вызов lock заблокирует выполнение, пока все такие блокировки не будут освобождены. Пока shared_mutex заблокирована в эксклюзивном режиме, никакие другие блокировки любого типа также не могут быть удержаны.
Если lock вызывается потоком, который уже владеет shared_mutex в любом режиме (эксклюзивном или общем), поведение не определено. Предыдущая операция unlock() над тем же мьютексом синхронизируется с (как определено в std::memory_order) этой операцией.
Параметры
(нет)
Возвращаемое значение
(нет)
Исключения
Бросает std::system_error при возникновении ошибок, включая ошибки из базовой операционной системы, которые помешают lock соответствовать своим спецификациям. В случае возникновения любого исключения мьютекс не блокируется.
Примечания
lock() обычно не вызывается напрямую: std::unique_lock, std::scoped_lock и std::lock_guard используются для управления эксклюзивной блокировкой.
Пример
#include <chrono>
#include <iostream>
#include <mutex>
#include <shared_mutex>
#include <syncstream>
#include <thread>
#include <vector>
std::mutex stream_mutx;
void print(auto const& 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); // better than:
// smtx.lock();
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
{
{
// better to use:
std::shared_lock lock(smtx); // smtx.lock_shared();
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
См. также
| пытается заблокировать мьютекс, возвращает, если мьютекс недоступен (публичный член-функция) |
|
| разблокирует мьютекс (публичный член-функция) |
|
| блокирует мьютекс для совместного владения, блокируется, если мьютекс недоступен (публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread/shared_mutex/lock