7

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

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

我(也许是错误的)假设这样的东西应该存在于 STL 或 boost 中,但我找不到任何东西。

我真的必须自己实现那个东西吗?这似乎是一个常见的场景......

4

6 回答 6

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);
}
于 2009-12-02T17:53:15.497 回答
2

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

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

IE

//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)

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

于 2009-12-02T03:46:39.967 回答
1

如果您在 Windows 上并且想要一个在管理允许运行的线程以从中处理项目方面高效的队列,请查看 IO Completion Ports(参见此处)。我的免费服务器框架包括一个基于 IOCP 的任务队列实现,如果您打算走这条路,也可能会感兴趣;尽管它可能对您想要的东西来说太专业了。

于 2009-12-02T18:03:38.507 回答
0

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

于 2009-12-02T17:55:53.740 回答
0

我认为message_queuefromboost::interprocess是你想要的。第二个链接有一个使用示例。

于 2009-12-01T13:43:20.667 回答
0

您应该看看ACE(自适应通信环境)和 ACE_Message_Queue。总是有 boost 的message_queue,但 ACE 是它在高性能并发方面所处的位置。

于 2009-12-01T13:47:38.377 回答