因为CreateThread()没有对C Runtime库中的全局变量进行保护,所以应该调用_begingthreadex()才是安全的。然而我发现MFC源代码中CWinThread类调用的正是CreateThread(),那么它是不是缺乏安全性呢?

解决方案 »

  1.   

    从实践上中,我还没有发现一起使用CreateThread和C Runtime库有任何问题,如果真有问题我应该见过,我写过很多多线程程序。
      

  2.   

    你可以看看Createthread里面调用的就是_beginthreadex,还加上很多动动。
    看你的程序使用在什么场合下了,如果要是标准的c++程序,我想还是用_beginthreadex吧,
      

  3.   

    to:leeza
    当然是_beginthreadex调用Createthread了。
    没有问题的,全局变量用好同步机制没有问题的!
      

  4.   

    开玩笑吧
    MFC中CWinThread类明明用的_beginthreadex
      

  5.   

    to sjzxyg我是说_beginthreadex调的Win32 api Createthread你参见thrdcore.cpp和process.cpp
      

  6.   


    _beginthreadex 比 CreateThread 安全,这句话紧紧在你在这个线程函数里调用了几个特殊的 CRunTime库的函数,那几个函数需要一个指针,这个指针是同线程的参数一同传给线程函数的, CreateThread 当然没有传这个指针, 而CreateThread在_beginthreadex里被调用了,而且改变了你的参数结构,在参数后面加入了一个结构
      

  7.   

    我明白了。
    答案在在thrdcore.cpp文件中,CWinThread类亦定义了一个名为CreateThread的成员函数,它调用的正是_beginthreadex,所以CWinThread是安全的。而Win32 API的CreateThread(声明在winbase.h)应该是不安全的,因而如果用MFC工作的话应调用CWinThread的成员函数CreateThread,否则就应该调用CRunTime库的函数_beginthreadex。我心里一直就觉得不妥:CWinThread作为MFC中的主力怎么会是不安全的呢?
    因为我以前用MFC写程序时都是调用AfxBeginThread启动一个worker线程,干完活儿就走人。前几天要用Win32 API写程序时查阅了一下《Windows核心编程》,才注意到了CreateThread和_beginthreadex的安全性问题,想到原来写的程序,于是去看AfxBeginThread源代码的定义,发现里面有CreateThread,也没仔细看就到这里来献丑,真是草率。衷心感谢各位的参与!