在C++11线程中通过引用传递;更改是本地化的
passing by reference in C++ 11 threads; changes are localized
我正试图使用C++11线程加快对opencv
代码的一些处理。
与此同时,我正在使用矢量共享数据
请考虑以下代码:
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;
}
在我看来,向量和应该在线程调用结束时修改,但当我稍后在主线程中打印它时,它的所有内容都为零。
为了通过引用传递,我们需要对函数参数进行哪些不同的处理?
绑定的函数参数是复制的,不会通过引用传递。这种行为与std::bind()
相同。参数作为推导的T&&
传递给构造函数,但这仅用于初始化某些保留值。
如果你不想复制参数,你可以传递一个std::reference_wrapper<T>
,例如,使用
std::thread(FindMSE_Fast, vector1, vector2, std::ref(sum), i)
而通过参考CCD_ 5。由于std::reference_wrapper<T>
有一个到T&
的转换运算符,您的函数将被适当地调用。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- C++为线程工作动态地分割例程
- 在C++11线程中通过引用传递;更改是本地化的