我有一个包含需要处理的元素的队列。我想并行处理这些元素。这将是需要同步的每个元素的一些部分。在任何时间点都可以有最大num_threads 个正在运行的线程。
我将提供一个模板,让您了解我想要实现的目标。
queue q
process_element(e)
{
lock()
some synchronized area
// a matrix access performed here so a spin lock would do
unlock()
...
unsynchronized area
...
if( condition )
{
new_element = generate_new_element()
q.push(new_element) // synchonized access to queue
}
}
process_queue()
{
while( elements in q ) // algorithm is finished condition
{
e = get_elem_from_queue(q) // synchronized access to queue
process_element(e)
}
}
我可以用
- 线程
- 开放式
- 英特尔线程构建块
我遇到的主要问题
- 确保在任何时候我都有最大num_threads运行线程
- 用于队列的轻量级同步方法
我的计划是 intel tbb concurrent_queue 用于队列容器。但是,我可以使用 pthreads 函数(互斥体、条件)吗?让我们假设这有效(它应该)。那么,如何使用 pthreads 在某个时间点拥有 max num_threads 呢?我想创建一次线程,然后在一个元素是进程之后,访问队列并获取下一个元素。但是,如果它更复杂,因为我不能保证如果队列中没有元素,算法就完成了。
我的问题
在我开始实施之前,我想知道是否有一种简单的方法可以使用 intel tbb 或 pthreads 来获得我想要的行为?更精确地并行处理队列中的元素
注意:我尝试使用任务但没有成功。