我正在尝试使用 OpenMP 实现单生产者多消费者模型(我知道我也可以使用可能更适合的 boost 线程)。
这是我的代码,它相当简单并且使用线程感知队列类型:
bool producer_finished = false;
#pragma omp parallel default( none ) shared( producer_finished, buffer, datagen )
{
#pragma omp sections
{
#pragma omp section
{ // single producer
while( datagen ) {
DType data = datagen.next()
buffer.push( data );
}
producer_finished = true;
#pragma omp flush( producer_finished )
} // end omp section
#pragma omp section
{
#pragma omp for schedule( static, 1 )
for ( int i = 0; i < omp_get_max_threads() - 1; ++i ) {
while ( ! producer_finished ) {
#pragma omp critical( buffer )
{
DType = buffer.pop();
}
processData( data );
outputData( data );
#pragma omp flush( producer_finished )
}
} // end omp for
} // end omp section
} //end omp sections
} // end omp parallel
这里的问题是生产者启动并推送数据,直到缓冲区已满,但消费者永远不会启动。如果我删除“for pragma”周围的部分,也会发生同样的情况。你能看出我的方法有什么问题吗?
我在编译过程中也收到了这个警告:
warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered or master region
它指的是for循环在section中的嵌套。在这种情况下,正确的方法是什么?
感谢您的反馈意见。
编辑:刚刚发现这个相关问题, set_omp_nested(1) 对我没有帮助。我会尝试将它放在单独的功能中......