当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《通过引用向量传递的线程函数启动缓慢》经验,为你挑选了1个好方法。

我一直在看C++ 0x线程并拥有以下代码:

#include 
#include 
#include 
void TestFunc(const vector& vVec)
{
    cout << "in"< vTest(sizer);
    for(int f=0; f

正如您所看到的,它只是将向量传递给线程.我不明白的是,在"V created"消息出现后有一个暂停.最初这个(我假设)是被复制用于函数的向量.为了阻止这一点,我通过引用传递,但这没有任何区别.

延迟似乎与向量的大小成正比,这表明它仍在复制(或对数组做一些事情).如果我在没有线程的情况下尝试相同的实验并直接调用该函数,则在传递值时会出现延迟,但在按预期方式通过引用时则不会.

我尝试使用Boost线程而不是C++ 0x(尽管我已经读过它们大致相同)并得到了相同的结果.

这种行为是否有某种原因或者我错过了一些令人眼花缭乱的事情?谢谢.

对不起,发布了错误的测试代码.纠正.编辑:根据要求添加了包含.

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



1> Martin B..:

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

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

std::bind(TestFunc, vTest)

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

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


@Omnifarious:我不确定这是否可取.从闭包(它本质上就是`bind`)所期望的行为是,只要闭包存在,作为参数传入的对象就"存活".如果`bind`仅存储引用类型的所有参数的引用,则情况不会如此.或者,以另一种方式看待它:复制所有参数是一种安全的默认行为.传递参考文件具有一定的危险性,因此应明确要求; 此外,明确的`ref`或`cref`对于稍后进行维护的人来说是一个明确的标志.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有