之前我整理过一篇C++20新特性的文章全网首发!!C++20新特性全在这一张图里了,里面提到过latch、barrier和semaphore,但是没有详细介绍过三者的作用和区别,这里详细介绍下。
latch
这个可能大多数人都有所了解,这就是我们经常会用到的CountDownLatch。用于使一个线程先阻塞,等待其他线程完成各自的工作后再继续执行。
CountDownLatch是通过计数器实现,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后等待的线程就可以打断阻塞去继续执行任务。
自己之前实现过一个CountDownLatch,源码大概这样:
barrier
许多线程在阻塞点阻塞,当到达阻塞点的线程达到一定数量时,会执行完成的回调,然后解除所有相关线程的阻塞,然后重置线程计数器,继续开始下一阶段的阻塞。
假设有很多线程并发执行,并在一个循环中执行一些计算。进一步假设一旦这些计算完成,需要在线程开始其循环的新迭代之前对结果进行一些处理。
看以下示例代码(摘自cppreference):
可能的输出如下:
semaphore
信号量,这个估计大家都很熟悉,本质也是个计数器,主要有两个方法:
acquire():递减计数器,当计数器为零时阻塞,直到计数器再次递增。
release():递增计数器(可传递具体数字),并解除在acquire调用中的线程的阻塞。
示例代码如下:
信号量也可以当作条件变量使用,这个我估计大家应该知道怎么做。
打完收工。
领取专属 10元无门槛券
私享最新 技术干货