为什么Main函数上的Sleep()会停止所有线程
Why Sleep() on Main function stop all threads?
为什么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
的调用由Win32串行化。 -
所有新线程都是从调用
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
相关文章:
- C++使用params创建线程函数会导致转换错误
- 如何在大函数中编写多线程函数?
- C++11:将矢量元素作为线程传递到线程函数中
- 线程函数中的c++参数更改
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 将项目插入 CTreeCtrl 时线程函数的奇怪行为
- C++ 线程函数通过引用传递
- 线程函数参数的前向声明不起作用
- 线程函数无法从堆上分配的缓冲区中读取字符
- 线程函数不打印
- C :如何在复杂模板类中指定线程函数
- 为什么我在C++线程函数调用中得到重复值?
- C++ 线程函数指针实现返回错误无效使用非静态成员函数
- 线程函数中的通用引用
- 如何同时启动两个具有不同线程函数的线程团队
- std::c++ 中的线程在设置线程函数时不会出错
- 对抽象类的引用不能传递给线程函数?
- 如何将ifstream作为参数传递给std ::线程函数
- 如何线程函数