Col*_*mbo 8 c++ multithreading reference vector
我一直在看C++ 0x线程并拥有以下代码:
#include <vector>
#include <iostream>
#include <thread>
void TestFunc(const vector<int>& vVec)
{
cout << "in"<<endl;
}
int main()
{
int sizer = 400000000;
vector<int> vTest(sizer);
for(int f=0; f<sizer; f++)
vTest[f] = f;
cout << "V created." << endl;
thread one(TestFunc, vTest);
one.join();
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它只是将向量传递给线程.我不明白的是,在"V created"消息出现后有一个暂停.最初这个(我假设)是被复制用于函数的向量.为了阻止这一点,我通过引用传递,但这没有任何区别.
延迟似乎与向量的大小成正比,这表明它仍在复制(或对数组做一些事情).如果我在没有线程的情况下尝试相同的实验并直接调用该函数,则在传递值时会出现延迟,但在按预期方式通过引用时则不会.
我尝试使用Boost线程而不是C++ 0x(尽管我已经读过它们大致相同)并得到了相同的结果.
这种行为是否有某种原因或者我错过了一些令人眼花缭乱的事情?谢谢.
对不起,发布了错误的测试代码.纠正.编辑:根据要求添加了包含.
编译:g ++ 44 -std = c ++ 0x -lpthread tester.cpp -o test ...因为我在我的Linux(CentOS)附带的标准GNU编译器旁边安装了GNU 4.4,它不支持C++ 11.
Mar*_*n B 17
我只是推测,因为你没有发布使用线程的代码版本,但我怀疑你的问题是,默认情况下,std::bind(或boost::bind)制作你绑定的所有参数的副本.为避免这种情况,您可以使用std::ref或std::cref.
为了使这个具体,你可能会这样使用bind:
std::bind(TestFunc, vTest)
Run Code Online (Sandbox Code Playgroud)
相反,你应该像这样使用它:
std::bind(TestFunc, std::cref(vTest));
Run Code Online (Sandbox Code Playgroud)