【发布时间】:2014-01-14 12:31:40
【问题描述】:
这应该不难理解:
bool ThreadIsRunning = false;
void Thread1(void *nothing){
ThreadIsRunning = true;
cout << "The thread is running!\n";
Sleep(1000);
cout << "Ending thread!\n");
ThreadIsRunning = false;
_endthread();
return;
}
int main(){
std::cout << "The thread is starting!\n";
_beginthread(Thread1, 0, 0);
std::cout << "Waiting for thread to end!\n";
while(ThreadIsRunning);
std::cout << "The thread is ended!\n";
return 0;
}
所以main 线程等待Thread1 将ThreadIsRunning 设置为false,对吗?
是的,但事实并非如此。当它变为假时,什么都不会发生。它不应该检查永恒的价值,直到它被改变?
如果我输入while(ThreadIsRunning) Sleep(10);,它会起作用,但我认为我的代码没有必要起作用。
while(ThreadIsRunning) void(); 也不起作用。
我正在使用 Visual Studio Ultimate 2012。
C/C++ 命令行选项:
/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc110.pdb" /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\Test1.pch"
链接器命令行选项:
/OUT:"<projectsfolder>\Test1\Release\Test1.exe" /MANIFEST /LTCG /NXCOMPAT /PDB:"<projectsfolder>\Test1\Release\Test1.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /OPT:REF /SAFESEH /INCREMENTAL:NO /PGD:"<projectsfolder>\Test1\Release\Test1.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Release\Test1.exe.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
编辑:
没有日程/比赛/时间问题。即使我在_beginthread(Thread1, 0, 0) 之后添加Sleep(1000);,问题仍然是当ThreadIsRunning 变为false 时没有任何反应
【问题讨论】:
-
你看到“线程已结束!”在你的输出中?你的程序结束了吗?
-
您真的在寻找这样的东西吗? stackoverflow.com/q/11779504/10077
-
这里有竞争条件。主线程很可能会在另一个线程启动之前检查
ThreadIsRunning。您还存在编译器完全优化变量访问的潜在问题,因为它没有考虑多线程。这些是在线程之间通信时应该使用同步原语(例如等待句柄)的原因。 Fred Larson 在他的评论中发布的链接是您想要的方式。 -
@HamletHakobyan 没有。程序没有结束。
-
@JimMischel 不,没有竞争条件。那不是问题。我可以添加另一个“睡眠”功能,但它仍然不会结束。是的,我也这么认为,编译器正在以一种不检查循环中变量的方式进行优化。但是如果我不想使用任何等待处理程序?为什么我不能使用我的方法?变量检查循环有什么问题?
标签: c++ multithreading while-loop