为什么 C++20 barrier 中存在分开的 arrive 和 wait?

Why do separate arrive and wait exist in C++20 barrier?

C++20 std::barrierarrive_and_wait 方法,几乎​​每个同步屏障实现都有。

但它也有单独的arrivewait。为什么会有这些功能?

好的,所以您有一堆线程必须执行某种同步任务。这些任务被分为几个阶段:一个阶段的任务将使用前一阶段的任务产生的数据,并且所有前一阶段的工作必须在任何下一阶段的工作开始之前完成。任何需要前一阶段数据的工作都应称为“同阶段”工作。

但是,假设并非您需要做的所有事情实际上都需要来自前一阶段的数据。线程可能会执行一些单独的工作项,但这些工作项不会从前一阶段读取数据。我们称之为“异相”工作。

如果您尝试在调用 arrive_and_wait 之前执行此异相工作,那么您可能会阻止所有其他线程执行某些操作,即使您已经完成了它们正在执行的实际工作等待。根据同相和异相工作之间的平衡,这可能是 很多 的性能浪费。

因此,如果线程已完成其同相工作并有一些异相工作要做,它可以 arrive。如果其他线程也完成了他们的同步工作,这可能会释放所有其他线程。然后线程可以去处理一些可能与下一阶段完成的工作异步的异相工作。完成异相工作后,线程可以 wait 通过其对 arrive 的调用生成的令牌,如果下一阶段已经开始,它将 return 而不会阻塞。

事实上,如果同相工作量远小于异相工作量,那么这种模式意味着线程几乎从不 阻塞。屏障只是作为多线程原子排序操作,从不阻塞。