Multithreading 线程构建块并发有界队列—;我如何«;关闭»;信息技术

Multithreading 线程构建块并发有界队列—;我如何«;关闭»;信息技术,multithreading,queue,tbb,Multithreading,Queue,Tbb,我正在使用concurrent\u bounded\u queueIntel TBB 4.1 Update 3在生产者线程和消费者线程之间进行通信: 队列类有一个名为abort的方法,该方法将tbb::user_abort抛出到阻止队列实例的pop和push的所有线程。两个线程之间的通信可能如下所示: ConsThread | ProdThread -----------+------------- q.pop | get new data (wait) | q.p

我正在使用
concurrent\u bounded\u queue
Intel TBB 4.1 Update 3在生产者线程和消费者线程之间进行通信:

队列类有一个名为
abort
的方法,该方法将
tbb::user_abort
抛出到阻止队列实例的
pop
push
的所有线程。两个线程之间的通信可能如下所示:

ConsThread | ProdThread
-----------+-------------
q.pop      |  get new data
(wait)     |  q.push
process    |  get new data
q.pop      |  no more data!
(wait)     |  q.abort
quit       |  quit
不幸的是,即使在这个简单的示例中,我也无法使用它来可靠地关闭队列,因为如果一些使用者在调用
abort
之前没有处理过
pop
ped数据,他们将完成迭代并返回到
pop
上的阻塞:

ConsThread | ProdThread
-----------+-------------
q.pop      |  get new data
(wait)     |  q.push
process    |  get new data
process    |  no more data!
process    |  q.abort
process    |  quit
process    |
q.pop      |
(wait)     |
(wait)     |
(wait)     |
(so lonely)|
现在,我正在使用一种相当令人厌恶的黑客技术,它会生成另一个未分离的线程(加入消费者池线程),并等待它完成,同时为后来者不时发送更多的
中止
s:

bool areConsumerThreadsJoinedThankYou = false;
std::thread joiner(Joiner(consumerPool, &areConsumerThreadsJoinedThankYou));

while (!areConsumerThreadsJoinedThankYou) {
    rawQueue.abort();
    MAGIC_MSLEEP(100);
}
类Joiner
的实现非常简单

void Joiner::operator()(void)
{
    for (auto it = this->m_threadPool.begin();
         it < this->m_threadPool.end();
         it++)
        (*it)->join();
    this->m_done = true;
    *(this->m_flag) = true;
}
void Joiner::operator()(void)
{
对于(auto it=this->m_threadPool.begin();
它m_threadPool.end();
it++)
(*it)->join();
此->m_done=true;
*(此->m_标志)=真;
}
这当然很难看。是否有更基本的解决方案?

创建指定的“EndOfData”项。如果您知道您有K个消费者,请让生产者在推送数据项之后推送K个“EndOfData”项。让每个消费者在弹出“EndOfData”项后退出


如果事先不知道K,则让制作人推送单个“EndOfData”项。然后让每个弹出“EndOfData”项目的消费者在离开前推另一个“EndOfData”项目。所有消费者完成后,将剩下一个“EndOfData”项目,当队列被销毁时,该项目将被销毁。

好吧,因为这是TBB的架构师提出的,我想没有更好的方法了:)谢谢您的夸奖。事实上,我是TBB的架构师,尽管Alexey Kukanov后来担任了TBB架构师的角色。