Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中构建多线程工作队列(消费者/生产者)+;_C++_Multithreading_Deque - Fatal编程技术网

C++ 在C+中构建多线程工作队列(消费者/生产者)+;

C++ 在C+中构建多线程工作队列(消费者/生产者)+;,c++,multithreading,deque,C++,Multithreading,Deque,我有以下场景:我有一个线程,它应该填充 容器中有成对的整数(本质上是任务描述),我有一个很大的 应从此容器中获取元素并执行的工作线程数(8-16) 一些工作 我认为阻塞队列可以很容易地解决这个问题——例如,在项目移除时,线程同步对队列的访问,如果没有可用数据,则休眠 我(可能是错误地)认为类似的东西应该存在于STL或boost中,但我找不到任何东西 我真的需要自己去实现吗?这似乎是一种常见的情况……我想这就是你想要的。第二个链接有一个用法示例。您应该查看和ACE\u消息队列。boost总是有的,

我有以下场景:我有一个线程,它应该填充 容器中有成对的整数(本质上是任务描述),我有一个很大的 应从此容器中获取元素并执行的工作线程数(8-16) 一些工作

我认为阻塞队列可以很容易地解决这个问题——例如,在项目移除时,线程同步对队列的访问,如果没有可用数据,则休眠

我(可能是错误地)认为类似的东西应该存在于STL或boost中,但我找不到任何东西


我真的需要自己去实现吗?这似乎是一种常见的情况……

我想这就是你想要的。第二个链接有一个用法示例。

您应该查看和ACE\u消息队列。boost总是有的,但ACE在高性能并发性方面处于领先地位。

如果您在windows上,请查看VS2010中的代理库,这是一个核心方案

i、 e

//一个无界的\u缓冲区就像一个队列
无界缓冲区buf;
//您可以使用send或asend向其中发送消息
发送(buf,1);
//接收将阻塞并等待数据
int结果=接收(buf)

您可以使用线程、“代理”或“任务”来获取数据。。。或者,您可以将缓冲区链接在一起,并将阻塞语义生产者/消费者问题转化为数据流网络。

如果您自己实现,则实现应该是信号量、互斥量和队列对象的简单组合

下面是一些伪代码:

Produce{
    pthread_mutex_lock(&mutex);
    queue.push_back(someObjectReference);
    pthread_mutex_unlock(&mutex);
    sem_post(&availabilitySem);
}

Consume{
    sem_wait(&availabilitySem);
    pthread_mutex_lock(&mutex);
    queue.pop_front(someObjectReference);
    pthread_mutext_unlock(&mutex);
}

如果您在OSX Snow Leopard上,您可能需要查看。

如果您在Windows上,并且希望队列在管理允许运行以处理来自它的项目的线程方面是高效的,那么请查看IO完成端口(请参阅)。My包括一个基于IOCP的任务队列实现,如果您打算沿着这条路线走下去,它可能也会引起您的兴趣;尽管它可能过于专业化,无法满足您的需求。

值得注意的是,根据您的信号量实现,消费过程可能需要在循环内部运行
Produce{
    pthread_mutex_lock(&mutex);
    queue.push_back(someObjectReference);
    pthread_mutex_unlock(&mutex);
    sem_post(&availabilitySem);
}

Consume{
    sem_wait(&availabilitySem);
    pthread_mutex_lock(&mutex);
    queue.pop_front(someObjectReference);
    pthread_mutext_unlock(&mutex);
}