关于_beginthreadex与AfxbeginThread

比较CreateThread,_beginthreadex与AfxbeginThread的文章已经很多了,介绍的已经很详细,其中比较优秀的有:

http://kulong0105.blog.163.com/blog/static/174406191201198104050236/

但是一直有个疑问

如果在线程中既可能使用MFC库,也可能使用C Run-time Library,这时应该使用什么方法创建线程?

尤其是编写SDK框架时,不应该给使用SDK开发人员太多的限制,虽然以上链接文章中已经给出以下一段话:

AfxBeginThread:

         MFC中线程创建的函数,首先创建了相应的CWinThread对象,然后调用CWinThread::CreateThread,在CWinThread::CreateThread中完成了对线程对象的初始化工作,然后,调用_beginthreadex创建线程。注意不要在一个MFC程序中使用_beginthreadex()或CreateThread()。

其中确实提到AfxbeginThread是调用_beginthreadex创建的线程,如果真的如此,那么使用AfxbeginThread创建的线程使用CRT就是安全的,但是网上资料进行此种说明的很少,总是不太放心,于是走查了一下MFC代码,发现了如下的代码:

CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam,
	int nPriority, UINT nStackSize, DWORD dwCreateFlags,
	LPSECURITY_ATTRIBUTES lpSecurityAttrs)
{
#ifndef _MT
	pfnThreadProc;
	pParam;
	nPriority;
	nStackSize;
	dwCreateFlags;
	lpSecurityAttrs;

	return NULL;
#else
	ASSERT(pfnThreadProc != NULL);

	CWinThread* pThread = DEBUG_NEW CWinThread(pfnThreadProc, pParam);
	ASSERT_VALID(pThread);

	if (!pThread->CreateThread(dwCreateFlags|CREATE_SUSPENDED, nStackSize,
		lpSecurityAttrs))
	{
		pThread->Delete();
		return NULL;
	}
	VERIFY(pThread->SetThreadPriority(nPriority));
	if (!(dwCreateFlags & CREATE_SUSPENDED))
		VERIFY(pThread->ResumeThread() != (DWORD)-1);

	return pThread;
#endif //!_MT)
}

可以看出AfxbeginThread是调用CWinThread的CreateThread方法,再查看CWinThread的CreateThread方法的实现,有如下代码片段

	// create the thread (it may or may not start to run)
	m_hThread = (HANDLE)(ULONG_PTR)_beginthreadex(lpSecurityAttrs, nStackSize,  
		&_AfxThreadEntry, &startup, dwCreateFlags | CREATE_SUSPENDED, (UINT*)&m_nThreadID);

可以看出在CWinThread的CreateThread方法中确实使用的_beginthreadex来创建的线程,所以可以确认在线程中既可能使用MFC库,也可能使用C Run-time Library时,就应该使用AfxbeginThread来创建线程。

可以总结应用场合如下

1、CreateThread,线程中不使用CRT,不使用MFC库

2、_beginthreadex,线程中使用CRT,不使用MFC库,初始化CRT后,调用CreateThread

3、AfxbeginThread,线程中使用CRT,使用MFC库,或者其中任何之一,初始化MFC后,调用_beginthreadex

总之在使用MFC的情况下,不管是否使用CRT,使用AfxbeginThread创建线程都是安全的。

你可能感兴趣的:(系统平台,C++)