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

Why is my variable not changing when modified in separate thread? c++/boost

本文关键字:改变 C++ boost 修改 变量 我的 单独 线程 为什么      更新时间:2023-10-16

我有一个指针(对象)向量,我使用 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
}

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

因此,您可能会看到线程更改了一些值,但它确实取消引用了一些过时的chunk变量,使用(不可预测的)内容作为指针,更改它认为是changed成员的内存位置。

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