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");
}