Один из пользователей компилятора Visual C++ привёл следующий пример кода и спросил, почему его цикл с условием выполняется бесконечно, хотя в какой-то момент условие должно перестать выполняться и цикл должен закончиться:
#include <windows.h>
int x = 0, y = 1;
int* ptr;
DWORD CALLBACK ThreadProc(void*)
{
Sleep(1000);
ptr = &y;
return 0;
}
int main(int, char**)
{
ptr = &x; // starts out pointing to x
DWORD id;
HANDLE hThread = CreateThread(nullptr, 0, ThreadProc, 0, &id);
// Ждём, пока другой поток изменит значение по указателю ptr
// на некоторое ненулевое число
while (*ptr == 0) { }
return 0;
}