- std::latch와 비슷하나, 재활용이 가능하고 callback 함수를 등록해서 사용할 수 있다.
barrier를 사용해서 재사용 하게 만들기
void onComplete()
{
std::cout << "onComplete" << std::endl;
}
// 등록한 콜백은 마지막에 도착한 스레드가 실행한다.
std::barrier sync_point{3, onComplete}; // c++17 이상
// std::barrier<void()> sync_point{3, onComplete}; // 추론이 안되므로 이렇게 처리.
void foo(std::string name)
{
std::cout << "start work : " << name << std::endl;
std::cout << "finish work : " << name << std::endl;
// 카운트를 감소시키고 0이 될때까지 대기.
sync_point.arrive_and_wait();
std::cout << "have dinner : " << name << std::endl;
// 위에서 완료되었을때 다시 카운터가 3이 된다.
sync_point.arrive_and_wait();
std::cout << "go home : " << name << std::endl;
}
int main()
{
std::jthread t1(foo, "kim"), t2(foo, "lee"), t3(foo, "park");
}