【线程退出】:VC线程安全退出的方法

1. 如果创建的线程属于阻塞类型的,比如线程函数中有套接字recv、sendto类似的操作,可能会死等着接收数据,这时想要退出该线程,只能用:

BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode ),强行终止该线程。

事实上,也没有好办法了,因为该线程的while循环不“转”了!


2. 如果创建的线程内while循环能够正常的在“转动”,应该使用下面方法:

bool g_bExit = false;

//测试是否安全退出的指针
unsigned char *buf = NULL;

UINT MyControllingFunction( LPVOID pParam )
{
	while(1)
	{
		static int k = 0;
		printf("线程内操作: %d\n", k++);
		Sleep(2000);
		if(g_bExit)
			break;
	}

	free(buf);
	buf = NULL;
	return 1L;
}


using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}
	else
	{
		//创建一个线程
		CWinThread *pThread = AfxBeginThread(MyControllingFunction, NULL);
		
		//随便分配一块内存区域
		buf = (unsigned char *)malloc(1024);
		
		//主线程
		while(1)
		{
			if(kbhit())
			{
				char ch = getch();
				if(ch == 27)//ESC
				{
					printf("主线程退出\n");
					g_bExit = true;
					break;
				}
			}
		}
	
		//一直等待创建的线程完全退出
		::WaitForSingleObject(pThread->m_hThread, INFINITE);
	}

	return nRetCode;
}

上述代码段的用意是:① 借助一个全局变量通知被创建的线程循环break后退出;② 在主线程使用WaitForSingleObject等待线程结束。

上述代码段的buf动态内存是模拟了在创建的线程,如果完全退出时,buf会被free释放掉,反之buf会内存泄露。可以注释掉WaitForSingleObject来验证buf是否存在内存泄露。


线程内Sleep两秒的用意,该线程不是一个完全阻塞线程,但又不是“转动”很快的线程。当主线程的while循环退出后,能观察到::WaitForSingleObject的作用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值