2017-11-02 1 views
0

Ich habe einen Vektor von Zeigern (Objekte), die ich in einen Thread mit boost :: ref übergeben, und in diesem Thread ändere ich einige Variablen der Objekte. Wenn ich wieder im Hauptthread bin, werden die im Thread vorgenommenen Änderungen nicht übernommen und haben ihre Standardwerte. Ich habe das debuggt und sie werden im Thread geändert, aber im Hauptthread wurden sie nicht geändert. Es ist, als würde boost :: ref nicht funktionieren und die Parameter werden als Wert übergeben.Warum ändert sich meine Variable nicht, wenn sie in einem separaten Thread geändert wird? C++/boost

Kann mir jemand zeigen, was ich falsch mache?

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

Bitte geben Sie eine [mcve] – user463035818

+1

btw es nicht wirklich verstehen, warum Sie denken, Sie brauchen einen Verweis auf Zeiger, das ist doppelte Indirektion, wenn eine einzige ausreichen sollte – user463035818

+0

Ich denke, dass das Problem könnte in "warten auf Threads zu beenden" . Sie sollten immer 'chunkThread.join()' oder 'chunkThread.detach()' in Ihrem Thread aufrufen. Wenn meine Vermutung nicht korrekt ist, geben Sie bitte ein vollständiges Beispiel an. – Ptaq666

Antwort

2

Sie geben den Faden einen Verweis auf die chunk Variable, die nicht mehr tut ‚existiert‘, nachdem die für die Schleife zu verlassen.

So können Sie den Faden sehen einen gewissen Wert zu ändern, aber es dereferenziert wirklich etwas abgestanden chunk Variable, verwendet die (unvorhersehbar) Inhalt als Zeiger, ändert sich die Speicherstelle von dem, was er denkt, ist das changed Mitglied.

Sie sollten es nicht geben ref. Der Thread benötigt den Zeiger, nicht die Variable , die den Zeiger enthält.

+0

Das war es, danke! – user

+0

Verdammt, ich bin gut. Vermeiden Sie Referenzen, wenn Sie Arbeiten an andere Threads delegieren (dasselbe gilt für Lambda-Captures). – xtofl

Verwandte Themen