gpt4 book ai didi

c++ - 在 C++ 11 线程中通过引用传递;变化是本地化的

转载 作者:太空狗 更新时间:2023-10-29 21:19:03 27 4
gpt4 key购买 nike

我正在尝试使用 C++ 11 线程来加快对我的 opencv 代码的一些处理。

与此同时,我正在使用 vector 来共享数据

请考虑以下一段代码:

start_t = cv::getTickCount();
std::vector <std::thread> tMSE_Calc(nComparisons);
std::vector<float> sum;
sum.resize(nComparisons);

for(int i = 0 ; i < nComparisons ; ++i)
{
tMSE_Calc[i] = std::thread(FindMSE_Fast, vector1, vector2, sum, i);
}

for(int i = 0 ; i < nComparisons ; ++i)
{
tMSE_Calc[i].join();
}
end_t = cv::getTickCount();
logfile << "Actual Comparison Took " << (end_t - start_t) * freq * 1000 << " milliseconds"<< std::endl;

for(int i = 0 ; i < nComparisons ; ++i)
{
std::cout << "Sum[" << i << "] = " << sum[i] << std::endl;
}

我有一个线程函数:

void FindMSE_Fast(cv::Mat& m1, cv::Mat& m2, std::vector<float>& sumVec, int idx)
{
cv::Mat s;
cv::absdiff(m1, m2, s);
s = s.mul(s);
cv::Scalar sum = cv::sum(s);
sumVec[idx] = cv::sqrt(sum[0]);
std::cout << "Difference is: " << cv::sqrt(sum[0]) << "index is: " << sumVec[idx] << std::endl;

//std::cout << "Difference is: " << cv::sqrt(sum[0]) << std::endl;
}

在线程调用结束时应该修改 vector 和对我来说似乎很明显,但是当我稍后在主线程中打印它时,它的所有内容都为零。

为了通过引用传递,我们需要对函数参数做一些不同的事情吗?

最佳答案

绑定(bind)的函数参数被复制,而不是通过引用传递。此行为与例如 std::bind() 相同。 .参数按推导方式传递 T&&到构造函数,但这仅用于初始化一些保存的值。

如果您不想复制参数,您可以传递 std::reference_wrapper<T>相反,例如,使用

std::thread(FindMSE_Fast, vector1, vector2, std::ref(sum), i)

同时通过sum引用。自 std::reference_wrapper<T>有一个到 T& 的转换运算符您的函数将被适本地调用。

关于c++ - 在 C++ 11 线程中通过引用传递;变化是本地化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523567/

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