나는 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
}
[mcve] – user463035818
btw를 제공하십시오. 왜 포인터를 참조 할 필요가 있다고 생각하는지 이해할 수 없습니다. 두 개의 간접 참조가 하나이면 충분합니다. – user463035818
"스레드가 완료 될 때까지 대기" . 당신은 항상 당신의 스레드에서'chunkThread.join()'또는'chunkThread.detach()'를 호출해야합니다. 내 추측이 정확하지 않은 경우 완전한 예를 제공해주십시오. – Ptaq666