- 主题:这个为什么vector里的值会变化呢?
pool tp(128); //boost::threadpool
for(i=0;i<N;i++){
std::vector<int> value = {i, i+1}; //返回一个数组
tp.schedule(boost::bind(bar, boost::cref(value))); //提交线程池处理
value
}
在bar函数里,value值就乱了。后来发现,每个value地址都是一样的
怎么能保证每个value地址不一样?
--
FROM 116.30.221.*
怎么每次new一个vector?
用 vector<int> a(6) 也是一样的地址
确实直接传value就可以了
tp.schduler(bind(bar, value));
【 在 z16166 (z16166) 的大作中提到: 】
: "const &value"的值在for循环的每一次循环中是一样的(可以看一下生成的汇编代码
: ,栈的布局),等于是多个线程读取了同一个地址上的栈变量。
: vs2019 debug编译,ebp-24h就是&value的值。
: int __stdcall _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
: LPTSTR lpCmdLine, int nShowCmd)
: ...................
--
修改:iwannabe FROM 116.30.221.*
FROM 116.30.221.*
en,我认为 vector<long> a={12,3}
每次创建一个新的vector呢
【 在 z16166 (z16166) 的大作中提到: 】
: auto value = new std::vector<int>;
: new出来的资源,如果子线程成功spawn,就在子线程中delete,否则在当前线程中
: delete。
: 也就是说,这里最好用带引用计数的智能指针来传递线程创建时的参数,当前线程有1
: 个引用,子线程也有1个引用。
: ...................
--
FROM 116.30.221.*
我大概知道了, 和c里 struct a 是创建在栈上一样
【 在 here080 (hero080) 的大作中提到: 】
: 当然是新vector
: 问题是这个vector的scope
: 建议你在使用线程库之前先学习一下“生命周期”的概念。
: ...................
--
修改:iwannabe FROM 116.30.221.*
FROM 116.30.221.*
用auto_ptr吗?
【 在 nsyncxyz (kakeru) 的大作中提到: 】
: 你为啥用引用,栈里传的值都销毁了,你引用的非法地址,兄弟,严重bug。
--
FROM 116.30.221.*