多线程成员函数c++
multi-threading member functions c++
所以我正在尝试在我正在编写的 "library" 中对两个矩阵对象之间的点积计算进行多线程处理。这是感兴趣的代码
double mat_cont::dot_t( mat_cont & other, const int offset, \
const int upper_lim)
{
double local_sum = 0;
for (int i = offset; i < upper_lim+offset; ++i)
local_sum+=(this->mat[i] + other.mat[i]);
return local_sum;
}
double mat_cont::dot( mat_cont & other){
future<double> threads[3];
int part = (int)(dim * dim) / (int)4;
double sum = 0;
for (int i = 1; i < 4; ++i){
threads[i-1] =
async (std::launch::async,&mat_cont::dot_t,
other, part*i, (i+1)*part);
}
for(int i = 0; i < part; ++i)
sum+=(this->mat[i] + other.mat[i]);
for(int i = 1; i < 3; ++i)
sum+=threads[i].get();
return sum;
}
并抛出此编译错误
error: no matching function for call to 'async'
threads[i-1] = async (std::launch::async,&mat_cont::dot_t, other, part*i, (i+1)*part);
^~~~~
/Applications/Xcode.app/Contents/Developer/
Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/future:2337:1:
note: candidate template ignored: substitution failure [with _Fp = double (mat_cont::*)(mat_cont &, int, int), _Args =
<mat_cont &, int, int>]: no type named 'type' in 'std::__1::__invoke_of<double (mat_cont::*)(mat_cont &, int, int), mat_cont, int, int>'async(launch __policy, _Fp&& __f, _Args&&... __args)
我想知道我是否可以对这部分进行多线程处理,或者我是否需要将这两个对象都传递给友元函数以进行多线程处理。我已经尝试调试了 2 个小时,有什么提示吗?
dot_t
是mat_cont
的成员函数,有3个参数,所以在async
函数的调用中少了一个元素——应该传递this
指针作为调用的第三个参数
threads[i-1] = async (std::launch::async,&mat_cont::dot_t, this, std::ref(other), part*i, (i+1)*part);
mat_cont::dot_t
是一个非静态成员函数,因此它需要一个 this
对象才能工作。
最简单的处理方法是使用捕获 this
指针的 lambda。然后您可以像在任何其他成员函数中一样调用 dot_t
:
threads[i-1] = std::async(std::launch::async,
[this, i, part, &other]() {
return dot_t(other, part*i, (i+1)*part);
});
所以我正在尝试在我正在编写的 "library" 中对两个矩阵对象之间的点积计算进行多线程处理。这是感兴趣的代码
double mat_cont::dot_t( mat_cont & other, const int offset, \
const int upper_lim)
{
double local_sum = 0;
for (int i = offset; i < upper_lim+offset; ++i)
local_sum+=(this->mat[i] + other.mat[i]);
return local_sum;
}
double mat_cont::dot( mat_cont & other){
future<double> threads[3];
int part = (int)(dim * dim) / (int)4;
double sum = 0;
for (int i = 1; i < 4; ++i){
threads[i-1] =
async (std::launch::async,&mat_cont::dot_t,
other, part*i, (i+1)*part);
}
for(int i = 0; i < part; ++i)
sum+=(this->mat[i] + other.mat[i]);
for(int i = 1; i < 3; ++i)
sum+=threads[i].get();
return sum;
}
并抛出此编译错误
error: no matching function for call to 'async'
threads[i-1] = async (std::launch::async,&mat_cont::dot_t, other, part*i, (i+1)*part);
^~~~~
/Applications/Xcode.app/Contents/Developer/
Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/future:2337:1:
note: candidate template ignored: substitution failure [with _Fp = double (mat_cont::*)(mat_cont &, int, int), _Args =
<mat_cont &, int, int>]: no type named 'type' in 'std::__1::__invoke_of<double (mat_cont::*)(mat_cont &, int, int), mat_cont, int, int>'async(launch __policy, _Fp&& __f, _Args&&... __args)
我想知道我是否可以对这部分进行多线程处理,或者我是否需要将这两个对象都传递给友元函数以进行多线程处理。我已经尝试调试了 2 个小时,有什么提示吗?
dot_t
是mat_cont
的成员函数,有3个参数,所以在async
函数的调用中少了一个元素——应该传递this
指针作为调用的第三个参数
threads[i-1] = async (std::launch::async,&mat_cont::dot_t, this, std::ref(other), part*i, (i+1)*part);
mat_cont::dot_t
是一个非静态成员函数,因此它需要一个 this
对象才能工作。
最简单的处理方法是使用捕获 this
指针的 lambda。然后您可以像在任何其他成员函数中一样调用 dot_t
:
threads[i-1] = std::async(std::launch::async,
[this, i, part, &other]() {
return dot_t(other, part*i, (i+1)*part);
});