为什么我的变量在单独的线程中修改时没有改变?C++/boost
Why is my variable not changing when modified in separate thread? c++/boost
我有一个指针(对象)向量,我使用 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
. 线程需要实际指针,而不是保存指针的变量。
相关文章:
- 变量没有改变?通过向量的函数调用
- 如何改变c++应用程序的视觉效果
- C++在不同线程中改变向量
- 如何访问和改变存储在矢量C++中的对象
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 为什么 c++ 动态数组的大小没有改变?
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 在向量内更改变量的值不会改变其在向量外的值
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 改变或缩放两个正态分布以具有特定的相关系数
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 为什么我的函数接受"std::string"进行排序不会改变它?
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 使用可变参数模板改变模板参数
- C++中物体改变识别的设计模式?
- 通过从构造函数中的'this'复制的指针改变常量对象
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 如果没有重新散列,为什么 unordered_set::begin() 会改变?