关于_beginthreadex与AfxbeginThread

来源:互联网 发布:大数据专业 大学 编辑:程序博客网 时间:2024/06/05 18:52

比较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 _MTpfnThreadProc;pParam;nPriority;nStackSize;dwCreateFlags;lpSecurityAttrs;return NULL;#elseASSERT(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创建线程都是安全的。

原创粉丝点击