美文网首页
Boost thread 库(持续更新)

Boost thread 库(持续更新)

作者: e196efe3d7df | 来源:发表于2021-11-11 21:34 被阅读0次

1. barrier(屏障)

https://www.boost.org/doc/libs/1_77_0/doc/html/thread/synchronization.html#thread.synchronization.barriers.barrier
文档:barrier也被称为等待点(google翻译叫“集合点”,但我认为“等待点”更合理一点),它是多个线程之间的同步点。barrier对象构造时,需要传入需要等待的线程数量(n),这些线程必须全部到达等待点(调用barrier::wait()的位置)后,才能继续往下走,并且barrier被重置。
个人理解:barrier这个词已经很好的能解释它的作用,可以被翻译为“屏障”或者“路障”,也就是当一个线程执行到等待点(调用barrier::wait()的位置),就被“挡”在这里,等待其它的线程也执行到等待点(调用barrier::wait()的位置)。然后,解除“屏障”,各个线程再往下执行。这也是线程同步的一个小trick,很简单,不难理解。
示例:官网没示例,可能是太简单了

2. latch(锁存器)

https://www.boost.org/doc/libs/1_77_0/doc/html/thread/synchronization.html#thread.synchronization.latches
文档:锁存器是一种线程协调机制,它允许一个或多个线程阻塞,直到一个或多个线程到达某个点。(google翻译复制的)
用法:
其一:父线程开启多个子线程执行一些任务(官网说的是:多个线程来执行一个任务,其实执行几个任务都无所谓),然后父线程等待这些子线程执行完,再往下执行。
其二:创建多个线程,在超出公共点之前等待信号。(啥意思,没搞懂)
第一个用途很好理解,很常用的功能,就是多个子线程执行任务,父线程阻塞在调用latch::wait()的位置,当每个子线程调用latch::.count_down()后,latch对象中维护的计数就会减一,直至等0,然后父线程解锁,继续往下执行。
第二个其实就是第一个用法的反过来使用,也就是所有子线程“挡在”latch::wait()的位置,等待其它线程执行latch::.count_down(),直至latch对象中维护的计数等0,然后所有被“挡住”的子线程解锁,继续往下执行。(跟barrier的功能有些类似,只不过barrier是“自动挡”,每次wait(),计数自动减一;而latch是“手动挡”,需要调用latch::.count_down(),计数才会减一)
示例:
用法1:

void DoWork(thread_pool* pool) {
  latch completion_latch(NTASKS);
  for (int i = 0; i < NTASKS; ++i) {
    pool->submit([&] {
      // perform work
      ...
      completion_latch.count_down();
    }));
  }
  // Block until work is done
  completion_latch.wait();
}

用法2:

void DoWork() {
  latch start_latch(1);
  vector<thread*> workers;
  for (int i = 0; i < NTHREADS; ++i) {
    workers.push_back(new thread([&] {
      // Initialize data structures. This is CPU bound.
      ...
      start_latch.wait();
      // perform work
      ...
    }));
  }
  // Load input data. This is I/O bound.
  ...
  // Threads can now start processing
  start_latch.count_down();
  }

相关文章

网友评论

      本文标题:Boost thread 库(持续更新)

      本文链接:https://www.haomeiwen.com/subject/dmmgzltx.html