C++1y(C++14)に向けて提案されている同期プリミティブについてメモ。N3600 C++ Latches and Barriers に基づく。
2019-09-11追記:C++2a(C++20)に向けて P1135R6 が採択され、C++標準ライブラリにstd::latch
とstd::barrier
が追加される。https://github.com/yohhoy/yamc にてエミュレーション実装提供。
- latchプリミティブ
- Nスレッド間でのタスク終了待ちに利用する。機能的にはJava 5以降の
CountDownLatch
、C# 4.0以降のCountdownEvent
が相当。 - barrierプリミティブ
- Nスレッド間での周期的な同期ポイントに利用する。Boost.Threadライブラリでは
barrier
クラスによって提供済み*1。機能的にはJava 5以降のCyclicBarrier
、C# 4.0以降のBarrier
、OpenMPのbarrier
指示文が相当。
メモ:N3600のlatchプリミティブはreset操作を提供しないため、インスタンスあたり1回しか機能しない。周期的スレッド間同期機構への誤った適用による不具合予防のためか。
関連URL
- Boost.Thread boost::barrier(2014-08-11追記:Boost 1.56.0でboost::latch追加)
- Java java.util.concurrent.CountDownLatch, java.util.concurrent.CyclicBarrir
- C# System.Threading.CountdownEvent, System.Threading.Barrier
- 本の虫: C++WG 2013-03-pre-Bristol mailingの簡易レビュー
*1:内部実装はC++11標準ライブラリ同期プリミティブだけで実現可能。http://www.boost.org/doc/libs/1_53_0/boost/thread/barrier.hpp