关于_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创建线程都是安全的。
- 关于_beginthreadex与AfxbeginThread
- 关于_beginthreadex、CreateThread、AfxBeginThread的选择
- 关于_beginthreadex、CreateThread、AfxBeginThread的选择
- 关于_beginthreadex、CreateThread、AfxBeginThread的选择
- _beginthreadex与createthread和AfxBeginThread的区别
- _beginthreadex与createthread和AfxBeginThread的区别
- _beginthreadex与createthread和AfxBeginThread的区别
- AfxBeginThread,_beginthreadex与CreateThread的关系
- CreateThread 与 _beginthreadex / _beginthread 及AfxBeginThread的区别
- _beginthread, _beginthreadex, CreateThread, AfxBeginThread
- CreateThread、_beginthreadex和AfxBeginThread
- CreateThread、_beginthreadex和AfxBeginThread
- CreateThread, AfxBeginThread,_beginthread, _beginthreadex
- _beginthreadex、CreateThread、AfxBeginThread
- CreateThread、_beginthreadex和AfxBeginThread
- CreateThread()、_beginthreadex()、AfxBeginThread()
- CreateThread、_beginthreadex、AfxBeginThread
- CreateThread、_beginthreadex和AfxBeginThread
- Android传感器学习一
- 开发的一些基本概念 I
- 手机GPRS、短信等设置
- 论坛管理严格,菜鸟不懂规则,只能这里把经验交流
- Centos6.4部署OpenStack
- 关于_beginthreadex与AfxbeginThread
- oracle 20130913级联
- ASP.NET控件缩写
- 北大 ACM 2602 Superlong sums
- 职场新人不可不知的职场礼仪
- Linux 下 rpm 和 yum 命令的使用
- oracle 20130914
- MINI2440+DM9000网络驱动分析之四
- 【转载】C#中传统方式进行数据库表信息查询