线程的创建
声明: static HANDLE thread = NULL;
创建: thread = CreateThrad(NULL, 0, 函数指针, NULL(指针参数), 0, NULL);
线程的关闭
直接用CloseHandle是不能关闭线程的,而是用来关闭句柄的,这里可能不像new和delete那样用。
我今天下午突然发现了我自己写的一个demo的一个BUG,那就是线程无法关闭,导致线程函数可能会去操作已经被销毁的变量,然后就会报错。
然后我在一个帖子(
传送门)里找到了解决方法。
大概的意思就是通过一个变量来告诉线程你可以关闭了(针对死循环线程),我对windows编程没什么太多研究,说法可能不太严谨
声明一个变量:
static HANDLE thread_exit = CreateEvent(NULL, TRUE, FALSE, NULL); // 原子量,用于控制线程结束
线程函数里面的写法:
static DWORD WINAPI recvFrom(PVOID psock) {
CSocket *socks = (CSocket*)psock;
//MessageBox(NULL, _T("test"), NULL, NULL);
while (WaitForSingleObject(thread_exit, 0) != WAIT_OBJECT_0) {
char buf[256] = { 0 };
socks->Recvfrom(buf);
printf("%s\n", buf);
if (!socks->getRecvList()->find(buf)) {
Node *tmp = new Node(&socks->getClient_addr(), buf, NULL);
//WaitForSingleObject(Mutex, 500);
socks->getRecvList()->push(tmp);
//ReleaseMutex(Mutex);
Sleep(1000);
}
//std::cout << (messages->empty() ? "空" : "不空") << std::endl;
//Sleep(1000);
}
return 0;
}
最关键的是这句:
while (WaitForSingleObject(thread_exit, 0) != WAIT_OBJECT_0) {
然后就是正确的关闭方式:
if (WaitForSingleObject(thread, 100) == WAIT_TIMEOUT) {
TerminateThread(thread, 0);
}
最后别忘了回收句柄:
CloseHandle(thread);
大功告成