CPP

使用 barrier 和 latch 实现线程同步

2018-08-14  本文已影响29人  顽强的猫尾草

锁存器(latch)是一种线程协调机制,允许一个或多个线程阻塞,直到某个操作完成。 单个 latch 是一次性对象,一旦操作完成,就无法重复使用。

  void DoWork(threadpool* pool) {
    boost::latch completion_latch(NTASKS);
    for (int i = 0; i < NTASKS; ++i) {
      pool->add_task([&] {
        ...
        // countdown--
        completion_latch.count_down();
      }));
    }
    // block until countdown to zero
    completion_latch.wait();
  }

栅栏(barrier)是一种线程协调机制,允许多个线程阻塞,直到操作完成。 与 latch 不同,barrier 可重复使用,一旦操作完成,线程可以重复使用相同的 barrier。 因此它对于管理由多个线程处理的重复任务很有用。

  void DoWork(threadpool* pool) {
    boost::barrier barr(NTASKS);
    for (int i = 0; i < NTASKS; ++i) {
      pool->add_task([&] {
        ...
        // block until all work get to here
        barr.wait();
      }));
    }
    // block until countdown to zero
  }

这两种同步方式的选择,就看你是想要阻塞所有线程等待操作(latch),还是阻塞在主线程的一个点而子线程可以灵活执行(barrier)。

上一篇 下一篇

猜你喜欢

热点阅读