Ich bin neu in C++ und experimentiere ein bisschen herum. Ich habe angefangen einen Thread mit der CreateThread-Methode zu erstellen. Ich gebe auch einen Zeiger auf eine struct-Methode, die einen Test-Wert verweist. So weit, ist es gut. Jetzt habe ich den Wert geändert, bevor ich den Thread auf 0 setze. Wenn ich das Programm starte, scheint alles wie erwartet zu funktionieren. Aber wenn ich den Wert auch nach der CreateThread-Methode (auf 1) ändere, gibt der Thread immer 1 aus. Ich erwartete eine Ausgabe von 0, weil ich dachte, dass Änderungen an einer Variablen den Thread nicht beeinflussen. Oder zumindest eine Ausgabe von 0 zuerst und dann 1.Anormale Ausgabe von Windows-Thread in C++
Jetzt habe ich etwas getestet: Wenn ich den Haupt-Thread z. B. warten 5000ms, dann ist die Ausgabe des Threads wieder immer 0. Aber ohne es ist wieder 1.
Ich hoffe, Sie können mir mit dem Verständnis dieses Problems helfen. Hier
ist ein Code:
struct TESTSTRUCT{
int test;
};
DWORD WINAPI testFunc(void* lpParam){
TESTSTRUCT& params=*((TESTSTRUCT*)lpParam);
int a=params.test;
while(true){
cout << a;
Sleep(5000);
}
return 0;
}
int main(int argc, char *argv[]) {
TESTSTRUCT teststr;
teststr.test=0;
HANDLE myhandle;
myhandle = CreateThread(0, 0, testFunc, &teststr, 0, 0);
Sleep(5000); // If left out, thread outputs always 1!
teststr.test=1;
cout << "main" << teststr.test;
CloseHandle(myhandle);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Das Betriebssystem entscheidet, wann "teststr.test" zugewiesen wird. Dies ist eine klassische Race-Bedingung, die in der Regel durch Sperren behandelt wird. –
Sind Sie sicher? Ich meine, es ist in der Hauptfunktion und jemand würde erwarten, ersten Wert 0 und 1 zuzuweisen. Oder kompiliert der Compiler in umgekehrter Reihenfolge? (von unten nach oben zum Beispiel). – Sully