为什么在单独的线程中修改时我的变量没有改变?C++/提升

KBZ

我有一个指针(对象)向量,我使用 boost::ref 将其传递到线程中,并且在该线程中我修改了对象的一些变量。当我回到主线程时,线程中所做的更改不会被应用并具有它们的默认值。我已经对此进行了调试,并且它们确实在线程中发生了变化,但是在主线程中它们并没有发生变化。就好像 boost::ref 不起作用并且参数是按值传递的。

有人可以告诉我我做错了什么吗?

std::vector<Chunk *> chunks = divideScreen(width, height, chunkSize);

for (Chunk * chunk : chunks) {
    chunk->changed = 1; //initial value is 0, change it to 1 before passing to thread
    boost::thread chunkThread =  boost::thread(boost::bind(&Renderer::render, this, boost::ref(chunk)));
}

//wait for threads to finish


//back in main thread
std::cout << chunks[0]->changed << endl; //prints 1


void Renderer::render(Chunk * chunk) {
    chunk->changed = 2; //should be 2 - prints 2 in thread
}
xtofl

您为线程提供了对该chunk变量的引用,该变量在退出 for 循环后不再“存在”。

所以你可能会看到线程改变了一些值,但它确实取消了一些陈旧的chunk变量的引用,使用(不可预测的)内容作为指针,改变了它认为是changed成员的内存位置

你不应该给它一个ref. 线程需要实际的指针,而不是持有指针的变量

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章