我一直在看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::ref
或std::cref
.为了使这个具体,你可能会这样使用
bind
:std::bind(TestFunc, vTest)相反,你应该像这样使用它:
std::bind(TestFunc, std::cref(vTest));
@Omnifarious:我不确定这是否可取.从闭包(它本质上就是`bind`)所期望的行为是,只要闭包存在,作为参数传入的对象就"存活".如果`bind`仅存储引用类型的所有参数的引用,则情况不会如此.或者,以另一种方式看待它:复制所有参数是一种安全的默认行为.传递参考文件具有一定的危险性,因此应明确要求; 此外,明确的`ref`或`cref`对于稍后进行维护的人来说是一个明确的标志.