作多线程程序,我使用AfxBeginThread开启worker和UI线程。
这样作主要是为了省事!
在MSDN上,AfxBeginThread好像说是首先为用户创建一个CWinThread的对象,然后调用CreateThread!用户只需要定义一个CWinThread指针,获得AfxBeginThread返回结果!
然后看了好多使用CreateThread的例子,也都是首先创建一个CWinThread对象:MyThread,然后调用MyThread.CreateThread(...)!(1)所以,我觉得AfxBeginThread和CreateThread骨子里是一样的,不知道是不是这样子?然后看了侯杰的《Win32多线程程序设计》,里面说好像多线程程序如果调用CRunTime函数库,就必须使用_createthreadex开启线程!而不能使用CreateThread!
但是我的程序一直使用AfxBeginThread,其实也是间接调用了CreateThread,同时也使用的CString之类的函数,而程序运行始终正常,除了在TRACE输出的时候会出现race condition之外。
(2)不知道是什么道理啊?肯请各位大侠赐教小弟!多谢

解决方案 »

  1.   

    视代码而定。不推荐直接调用Windows API CreateThread。
    线程中不使用MFC就用beginthreadEx,否则还是用MFC的Afxbeginthread吧。MFC里面大把的函数引用线程局部存储的。
      

  2.   

    >>(1)所以,我觉得AfxBeginThread和CreateThread骨子里是一样的,不知道是不是这样
    子?
    任何启动线程的函数包括 AfxBeginThread,追溯到根源都是调用的API函数中的CreateThread函数,区别在于,AfxBeginThread和_beginthreadex函数都提供了线程局部存储的机制,把线程中一些局部变量存储在特定的结构中,比如线程的错误代码,这样在多线程程序中,如果某个线程出错,错误代码只是该线程所有,不会影响到其他未出错线程的错误代码值!举了个例子,希望对你有所帮助!
      

  3.   

    Windows 有一个API CreateThread(..)......而AfxBeginThread(..)...是对该API的封装.....
    _beginthreadex是标准VC运行库函数......
    至于所说的MyThread.CreateThread(...)中的CreateThread(..)是MFC中CWinThread类的一个成员函数......用法同楼上之见解.....
      

  4.   

    在《Windows核心编程》中 ,作者极力推崇使用_beginthreadex
      

  5.   

    (3)对于AfxBeginThread开启的线程,要想干净消除它的影响,是否应该这样作?   (a)在线程内部调用PostQuitMessage(0);
       (b)WaitForSingleObject(MyThread->m_hThread,INFINITE);
       (c)delete MyThread;
         MyThread=NULL;谢谢!
      

  6.   

    你可以不必这样作,因为CWinThread类的m_bAutoDelete在默认情况下是true;也就是该线程对象在线程结束之后会自动销毁自己,不必显示的delete
    如果你显示的设置m_bAutoDelete为false;那么就用到你所说的方法了!