关于_beginthreadex与AfxbeginThread

关于_beginthreadex与AfxbeginThread比较CreateThread,_beginthreadex与AfxbeginThread的文章已经很多了,介绍的已经很详细,其中比较优秀的有:http://kulong0105.blog.163.com/blog/static/174406191201198104050236/但是一直有个疑问如果在线程中既可能使用MFC库,也可能使用CRun-timeLibrary,这时应该使

关于_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创建线程都是安全的。

今天的文章关于_beginthreadex与AfxbeginThread分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/29946.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注