为什么Main函数上的Sleep()会停止所有线程

Why Sleep() on Main function stop all threads?

本文关键字:线程 函数 Main Sleep 为什么      更新时间:2023-10-16

为什么Sleep()会停止所有创建的线程?我想创建一个线程,但在线程完成之前,Main函数一直处于睡眠状态。

bool _finished = false;
void testcount(void *p){
int i = 0;
while(i<=30){
i++;
std::cout<<i<<"n";
Sleep(1000);
}
_finished = true;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
HANDLE test = NULL;
test = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)testcount, NULL, NULL, NULL);
if(test)
std::cout<<"test thread created";
CloseHandle(test);
while(!_finished)
Sleep(1000);
return true;
}

我现在这样尝试,但程序永远不会完成,因为whileSleep会停止线程。线程未完成时,我不想在Main上返回任何内容。有什么解决方案吗?

  1. DllMain的调用由Win32串行化。

  2. 所有新线程都是从调用DllMain(带有线程附加标志(开始的,并且调用传递给CreateThread的方法。

因此,您的线程正在等待调用DllMain,这在您的第一个线程离开DllMain之前不会发生。

正如评论人JohnSheridan指出的,RaymondChen 2007年的博客文章是一个很好的解释。

PS。要进行正确的C/C++库初始化,您应该使用_beginthread_beginthreadex,而不是直接使用CreateThread

新线程被阻塞,因为您的主线程没有离开DllMain,如Richard的回答中所述。

您的代码还包含一个数据争用,即使在这个死锁被修复后,它也有未定义的行为。新线程同时写入_finished,主线程同时读取_finished。您可以尝试使用std::atomic<bool>而不是bool来修复此问题,假设C++11可用,或者您可以使用Win32基元进行线程同步。

使用std::atomic<bool>:对标准溶液的更改

#include <atomic>
std::atomic<bool> finished_{false};
// Rest remains the same