gpt4 book ai didi

c++ - 通过引用 vector 传递的线程函数启动缓慢

转载 作者:可可西里 更新时间:2023-11-01 17:23:30 26 4
gpt4 key购买 nike

我一直在研究 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();

}

如您所见,它只是将 vector 传递给线程。我不明白的是,出现“V created”消息后有一个停顿。最初这(我假设)是被复制用于函数的 vector 。为了阻止这种情况,我改为通过引用传递,但这没有任何区别。

延迟似乎与 vector 的大小成正比,这表明它仍在复制(或对数组进行某些操作)。如果我在没有线程的情况下尝试相同的实验并直接调用该函数,则在按值传递时存在延迟,但在按引用传递时却没有,正如我预期的那样。

我使用 Boost 线程而不是 C++0x 进行了相同的尝试(即使我读到它们非常相似)并得到了相同的结果。

这种行为是否有某种原因,或者我错过了一些非常明显的事情?谢谢。

抱歉,贴错了测试代码。更正。编辑:根据要求添加包括。

编译:g++44 -std=c++0x -lpthread tester.cpp -o 测试...因为我在不支持 C++11 的 Linux (CentOS) 附带的标准 GNU 编译器旁边安装了 GNU 4.4。

最佳答案

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

为了使这个具体化,您可能像这样使用 bind:

std::bind(TestFunc, vTest)

相反,你应该这样使用它:

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

关于c++ - 通过引用 vector 传递的线程函数启动缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8295354/

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