【发布时间】:2019-11-08 10:38:50
【问题描述】:
为什么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;
}
我现在正在尝试这样,但程序永远不会完成,因为while 和Sleep 会停止线程。我不想在线程未完成时在Main 上返回任何内容。有什么解决办法吗?
【问题讨论】:
-
在做线程之前,请阅读 DllMain 上的文档
-
在新线程的代码到达
testcount之前 - 它会尝试使用DLL_THREAD_ATTACH调用 dlls 入口点。内部临界区(加载程序锁)。但你的第一个线程持有这个关键部分 - 在这里等待。结果-您的新线程将等到父线程释放加载程序锁定。但它一直等到_finished- 永远如此。死锁 -
来自@engf-010 的好建议。旧的但写得很好的文章应该会给你一个很好的理解。 devblogs.microsoft.com/oldnewthing/?p=25283
-
Dynamic-Link Library Best Practices: "你不应该在 DllMain 中执行以下任务:[...] 调用 CreateThread。创建线程可以工作 如果你不与其他线程同步线程".
标签: c++ windows multithreading winapi