名前空間
変種
操作

std::latch

From cppreference.com
< cpp‎ | thread
 
 
並行性サポートライブラリ
スレッド
(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)
セマフォ
ラッチとバリア
latch
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
ヘッダー <latch> で定義
class latch;
(C++20以降)

latch クラスは std::ptrdiff_t 型のダウンカウンターであり、スレッドの同期に使用できます。カウンターの値は生成時に初期化されます。スレッドは、カウンターがゼロにデクリメントされるまでラッチ上でブロックすることがあります。カウンターをインクリメントしたりリセットしたりすることはできないため、ラッチは一度だけ使用可能なバリアとなります。

デストラクターを除き、std::latch のメンバー関数を同時に呼び出してもデータ競合は発生しません。

目次

[編集] データメンバー

名前 定義
std::ptrdiff_t counter 内部カウンター
(説明用のメンバオブジェクト*)

[編集] メンバー関数

latch を構築する
(public member function) [編集]
latch を破棄する
(public member function) [編集]
operator=
[削除]
latch は代入不可
(public member function)
非ブロッキングでカウンターをデクリメントする
(public member function) [編集]
内部カウンターがゼロに等しいかテストする
(public member function) [編集]
カウンターがゼロになるまでブロックする
(public member function) [編集]
カウンターをデクリメントし、ゼロになるまでブロックする
(public member function) [編集]
定数
[static]
実装がサポートするカウンターの最大値
(public static member function) [編集]

[編集] ノート

機能テストマクロ 規格 機能
__cpp_lib_latch 201907L (C++20) std::latch

[編集]

#include <functional>
#include <iostream>
#include <latch>
#include <string>
#include <thread>
 
struct Job
{
    const std::string name;
    std::string product{"not worked"};
    std::thread action{};
};
 
int main()
{
    Job jobs[]{{"Annika"}, {"Buru"}, {"Chuck"}};
 
    std::latch work_done{std::size(jobs)};
    std::latch start_clean_up{1};
 
    auto work = [&](Job& my_job)
    {
        my_job.product = my_job.name + " worked";
        work_done.count_down();
        start_clean_up.wait();
        my_job.product = my_job.name + " cleaned";
    };
 
    std::cout << "Work is starting... ";
    for (auto& job : jobs)
        job.action = std::thread{work, std::ref(job)};
 
    work_done.wait();
    std::cout << "done:\n";
    for (auto const& job : jobs)
        std::cout << "  " << job.product << '\n';
 
    std::cout << "Workers are cleaning up... ";
    start_clean_up.count_down();
    for (auto& job : jobs)
        job.action.join();
 
    std::cout << "done:\n";
    for (auto const& job : jobs)
        std::cout << "  " << job.product << '\n';
}

出力

Work is starting... done:
  Annika worked
  Buru worked
  Chuck worked
Workers are cleaning up... done:
  Annika cleaned
  Buru cleaned
  Chuck cleaned

[編集] 関連項目

(C++20)
再利用可能なスレッドバリア
(class template) [編集]
English 日本語 中文(简体) 中文(繁體)