用C ++构建多线程工作队列(使用者/生产者)

时间:2009-12-01 13:36:11

标签: c++ multithreading deque

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

我认为这个问题可以通过阻塞队列轻松解决 - 例如关于项目删除,线程同步对队列的访问,如果没有可用数据则休眠。

我(也许是错误的)认为这样的事情应该存在于STL或者boost中,但我无法找到任何东西。

我真的必须自己实施这件事吗?这似乎是一种常见的情景...

6 个答案:

答案 0 :(得分:4)

如果您自己实现它,那么实现应该是信号量,互斥体和队列对象的相当简单的组合。

这是一些伪代码:

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);
}

答案 1 :(得分:2)

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

http://msdn.microsoft.com/en-us/library/dd492627(VS.100).aspx

//an unbounded_buffer is like a queue
unbounded_buffer<int> buf;

//you can send messages into it with send or asend
send(buf,1);

//receive will block and wait for data
int result = receive(buf)

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

答案 2 :(得分:1)

如果您在Windows上并且想要一个高效的队列来管理允许运行的线程来处理来自它的项目,那么请查看IO完成端口(请参阅here)。我的free server framework包括一个基于IOCP的任务队列实现,如果你打算沿着这条路线走下去也可能会感兴趣;虽然它可能对你想要的东西太专业了。

答案 3 :(得分:0)

我认为来自message_queueboost::interprocess是你想要的。第二个链接有一个用法示例。

答案 4 :(得分:0)

您应该查看ACE (Adaptive Communication Environment)和ACE_Message_Queue。总是提升message_queue,但ACE就高性能并发性而言。

答案 5 :(得分:0)

如果您使用的是OSX Snow Leopard,您可能需要查看Grand Central Dispatch