在C++中有没有一种方法可以同时在多个线程上调用join?

vq8itlhq  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(84)

众所周知的select()使能程序在多个套接字上对块进行编程,直到其中一个套接字变得可用并需要处理。假设我有多个线程,每个线程都在做自己的任务,我不会只在第一个线程上调用join和block。在C++中有没有办法处理它?
另外,有没有一个非阻塞版本的join,这样thread_select就可以实现了?

6gpjuf90

6gpjuf901#

听起来你想对线程做select对描述符做的事情。因此,如果select等待某个描述符集合中的 * 任何一个 * 成员有数据要读取,这是否意味着您需要一种方法来等待某个线程集合中的任何一个成员终止?
如果是这样,那么“是的”,有一种方法,但“不”,没有任何标准的库方法可以调用。你得自己写代码。
一种方法是使用std::counting_semaphore

  • 构造信号量,使其内部许可计数器初始化为零,
  • 使每个等待的线程release在线程死亡之前允许信号量,以及
  • 让等待线程调用sem.acquire()

acquire函数将在任何一个等待的线程释放许可后立即返回(即,任何一个等待的线程完成了它应该做的事情)。
另一种方法是使用布尔标志和mutexcondition variable。该标志将被初始化为false,等待的线程将在结束前将其设置为true,并将notify设置为条件变量。等待的线程将循环,调用cv.wait(),直到标志变为true。

相关问题