我一直在看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();
}
正如你所看到的,它只是将一个向量传递给一个线程。 我不明白的是,在“V created”消息出现后有一个暂停。最初这个(我假设)是被复制用于函数的向量。 为了阻止这一点,我通过引用传递,但这没有任何区别。
延迟似乎与向量的大小成正比,这表示它仍在复制(或对数组执行某些操作)。 如果我在没有线程的情况下尝试相同的实验并直接调用函数,则在传递值时会出现延迟,但在按预期传递时不会出现延迟。
我尝试使用Boost线程代替C ++ 0x(即使我已经读过它们大致相同)并得到了相同的结果。
这种行为是否有某种原因或者我错过了一些令人眼花缭乱的事情? 感谢。
抱歉,发布了错误的测试代码。纠正。 编辑:根据要求添加了包含。
编译: g ++ 44 -std = c ++ 0x -lpthread tester.cpp -o test ...因为我在我的Linux(CentOS)附带的标准GNU编译器旁边安装了GNU 4.4,它不支持C ++ 11。
答案 0 :(得分:17)
我只是推测,因为你还没有发布使用线程的代码版本,但我怀疑你的问题是,默认情况下,std::bind
(或boost::bind
)make您绑定的所有参数的副本。为避免这种情况,您可以使用std::ref
或std::cref
。
为了使这个具体,你可能正在使用bind
这样:
std::bind(TestFunc, vTest)
相反,您应该像这样使用它:
std::bind(TestFunc, std::cref(vTest));
答案 1 :(得分:-1)
这里的主题在哪里?看起来for
循环导致您所指的延迟。这里没什么不寻常的 - 因为你正在分配一个大小为200000000的向量。