VC++线程的创建和关闭

来源:互联网 发布:淘宝推荐系统 编辑:程序博客网 时间:2024/05/01 10:56

线程的创建

声明: 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);

大功告成


0 0
原创粉丝点击