gpt4 book ai didi

c++ - 在 tbb::parallel_for 中使用 tbb::queueing mutex 的简单示例程序无法编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:20 28 4
gpt4 key购买 nike

这是我用来学习如何使用 TBB 的玩具示例。 Parallel::operator() 应该并行运行,但它有一个临界区,一次只能由一个处理器访问,因此它打印的消息不会被扰乱。我的问题是它无法编译,而且编译器消息对我帮助不大。我做错了什么?

此外,这是否被认为是在 parallel_for 中实现互斥锁的正确方法?

#include <iostream>
#include <vector>
#include <cmath>
#include <tbb/tbb.h>

typedef tbb::queuing_mutex Mutex;

struct Parallel
{
Mutex mutex;
std::vector<int> * values;

Parallel(std::vector<int> * values_) : values(values_) {}

void operator()( tbb::blocked_range< unsigned int > & range ) const {
for(unsigned int i = range.begin(); i < range.end(); ++i) {
{
Mutex::scoped_lock lock(mutex);
if ( (*values)[i] > 40)
{
std::cout << "NO SCRAMBLING ALLOWED!\n";
std::cout.flush();
}
lock.release();
}
}
}
};

int main() {
const int someValue = 20000;

std::vector<int> data(someValue);
for(int i = 0; i < someValue; ++i) {
data[i] = std::rand();
}

tbb::parallel_for( tbb::blocked_range<unsigned int>(0, data.size()),
Parallel(&data) );
}

错误信息如下:

/path-to-src/main.cpp: In member function 'void Parallel::operator()(tbb::blocked_range<unsigned int>&) const':
/path-to-src/main.cpp:20:46: error: no matching function for call to 'tbb::queuing_mutex::scoped_lock::scoped_lock(const Mutex&)'
/path-to-src/main.cpp:20:46: note: candidates are:
In file included from /usr/include/tbb/tbb.h:65:0,
from /path-to-src/main.cpp:4:
/usr/include/tbb/queuing_mutex.h:80:9: note: tbb::queuing_mutex::scoped_lock::scoped_lock(tbb::queuing_mutex&)
/usr/include/tbb/queuing_mutex.h:80:9: note: no known conversion for argument 1 from 'const Mutex {aka const tbb::queuing_mutex}' to 'tbb::queuing_mutex&'
/usr/include/tbb/queuing_mutex.h:77:9: note: tbb::queuing_mutex::scoped_lock::scoped_lock()
/usr/include/tbb/queuing_mutex.h:77:9: note: candidate expects 0 arguments, 1 provided
/usr/include/tbb/queuing_mutex.h:66:11: note: tbb::queuing_mutex::scoped_lock::scoped_lock(const tbb::queuing_mutex::scoped_lock&)
/usr/include/tbb/queuing_mutex.h:66:11: note: no known conversion for argument 1 from 'const Mutex {aka const tbb::queuing_mutex}' to 'const tbb::queuing_mutex::scoped_lock&'

最佳答案

tbb::parallel_for 被设计为不编译编写的示例。它可以防止代码中的错误。 tbb::parallel_for 的范围形式按值将仿函数复制到多个任务对象中。因此每个任务将有一个单独的互斥锁拷贝,因此互斥锁不会提供预期的同步。

修复代码的方法是在 parallel 结构之外声明互斥锁,并通过指针传递它,类似于“值”的指针。

关于c++ - 在 tbb::parallel_for 中使用 tbb::queueing mutex 的简单示例程序无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862975/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com