众所周知的select()使能程序在多个套接字上对块进行编程,直到其中一个套接字变得可用并需要处理。假设我有多个线程,每个线程都在做自己的任务,我不会只在第一个线程上调用join和block。在C++中有没有办法处理它?另外,有没有一个非阻塞版本的join,这样thread_select就可以实现了?
select()
thread_select
6gpjuf901#
听起来你想对线程做select对描述符做的事情。因此,如果select等待某个描述符集合中的 * 任何一个 * 成员有数据要读取,这是否意味着您需要一种方法来等待某个线程集合中的任何一个成员终止?如果是这样,那么“是的”,有一种方法,但“不”,没有任何标准的库方法可以调用。你得自己写代码。一种方法是使用std::counting_semaphore。
select
std::counting_semaphore
release
sem.acquire()
acquire函数将在任何一个等待的线程释放许可后立即返回(即,任何一个等待的线程完成了它应该做的事情)。另一种方法是使用布尔标志和mutex和condition variable。该标志将被初始化为false,等待的线程将在结束前将其设置为true,并将notify设置为条件变量。等待的线程将循环,调用cv.wait(),直到标志变为true。
acquire
false
notify
cv.wait()
1条答案
按热度按时间6gpjuf901#
听起来你想对线程做
select
对描述符做的事情。因此,如果select
等待某个描述符集合中的 * 任何一个 * 成员有数据要读取,这是否意味着您需要一种方法来等待某个线程集合中的任何一个成员终止?如果是这样,那么“是的”,有一种方法,但“不”,没有任何标准的库方法可以调用。你得自己写代码。
一种方法是使用
std::counting_semaphore
。release
在线程死亡之前允许信号量,以及sem.acquire()
。acquire
函数将在任何一个等待的线程释放许可后立即返回(即,任何一个等待的线程完成了它应该做的事情)。另一种方法是使用布尔标志和mutex和condition variable。该标志将被初始化为
false
,等待的线程将在结束前将其设置为true,并将notify
设置为条件变量。等待的线程将循环,调用cv.wait()
,直到标志变为true。