为啥在单独的线程中修改时我的变量没有改变? 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++/升压的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考

为啥我的变量在函数内部修改后没有改变? - 异步代码参考