为啥在单独的线程中修改时我的变量没有改变? c++/升压
Posted
技术标签:
【中文标题】为啥在单独的线程中修改时我的变量没有改变? c++/升压【英文标题】:Why is my variable not changing when modified in separate thread? c++/boost为什么在单独的线程中修改时我的变量没有改变? c++/升压 【发布时间】:2017-11-02 10:31:42 【问题描述】:我有一个指针(对象)向量,我使用 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
【问题讨论】:
请提供minimal reproducible example 顺便说一句,它真的不明白为什么你认为你需要一个指针的引用,那就是双重间接,当一个单一的就足够了 我认为问题可能在于“等待线程完成”。您应该始终在您的线程上调用chunkThread.join()
或chunkThread.detach()
。如果我的猜测不正确,请提供一个完整的例子。
【参考方案1】:
您为线程提供了对 chunk
变量的引用,该变量在退出 for 循环后不再“存在”。
所以你可能会看到线程改变了一些值,但它确实取消了一些陈旧的chunk
变量的引用,使用(不可预测的)内容作为指针,改变了它认为是changed
成员的内存位置。
你不应该给它ref
。线程需要实际的指针,而不是持有指针的变量。
【讨论】:
该死的我很好。将工作委派给其他线程时避免引用(与 lambda 捕获相同)。以上是关于为啥在单独的线程中修改时我的变量没有改变? c++/升压的主要内容,如果未能解决你的问题,请参考以下文章