我有一个指针(对象)的向量,我使用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
}
答案 0 :(得分:2)
为线程提供对chunk
变量的引用,该变量在退出for循环后不再“存在”。
所以你可能会看到线程改变了一些值,但它确实取消了一些陈旧的chunk
变量,使用(不可预测的)内容作为指针,改变了它认为是{{1}的内存位置会员。
你不应该给它changed
。线程需要实际指针,而不是变量持有指针。