通过引用向量传递的线程函数启动缓慢

时间:2011-11-28 11:46:31

标签: c++ multithreading vector reference

我一直在看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。

2 个答案:

答案 0 :(得分:17)

我只是推测,因为你还没有发布使用线程的代码版本,但我怀疑你的问题是,默认情况下,std::bind(或boost::bind)make您绑定的所有参数的副本。为避免这种情况,您可以使用std::refstd::cref

为了使这个具体,你可能正在使用bind这样:

std::bind(TestFunc, vTest)

相反,您应该像这样使用它:

std::bind(TestFunc, std::cref(vTest));

答案 1 :(得分:-1)

这里的主题在哪里?看起来for循环导致您所指的延迟。这里没什么不寻常的 - 因为你正在分配一个大小为200000000的向量。