首页 > 试题广场 >

如果要实现一个多线程(非MFC)程序, 选择多线程CRT,

[单选题]
如果要实现一个多线程(非MFC)程序, 选择多线程CRT, 创建线程的时候应该用CreateThread还是_beginthreadex()?
  • CreateThread
  • _beginthreadex
  • 一样
  • 和具体机器配置相关
  _beginthreadex()比较于 CreateThread()有更高的线程安全性,不会造成多个线程共用同一个全局变量的情况
发表于 2015-08-02 14:44:30 回复(0)
前面几位说的也是比较一针见血,展开再总结一下区别吧:

       CreateThread()函数是Windows提供的API接口,在C/C++语言另有一个创建线程的函数_beginthreadex(),在很多书上(包括《Windows核心编程》)提到过尽量使用_beginthreadex()来代替使用CreateThread(),这是为什么了?下面就来探索与发现它们的区别吧。

       首先要从标准C运行库与多线程的矛盾说起,标准C运行库在1970年被实现了,由于当时没任何一个操作系统提供对多线程的支持。因此编写标准C运行库的程序员根本没考虑多线程程序使用标准C运行库的情况。比如标准C运行库的全局变量errno。很多运行库中的函数在出错时会将错误代号赋值给这个全局变量,这样可以方便调试。但如果有这样的一个代码片段:

  1. if (system("notepad.exe readme.txt") == -1)  
  2. {  
  3.     switch(errno)  
  4.     {  
  5.         ...//错误处理代码  
  6.     }  
  7. }  

      假设某个线程A在执行上面的代码,该线程在调用system()之后且尚未调用switch()语句时另外一个线程B启动了,这个线程B也调用了标准C运行库的函数,不幸的是这个函数执行出错了并将错误代号写入全局变量errno中。这样线程A一旦开始执行switch()语句时,它将访问一个被B线程改动了的errno。这种情况必须要加以避免!因为不单单是这一个变量会出问题,其它像strerror()strtok()tmpnam()gmtime()asctime()等函数也会遇到这种由多个线程访问修改导致的数据覆盖问题。

       为了解决这个问题,Windows操作系统提供了这样的一种解决方案——每个线程都将拥有自己专用的一块内存区域来供标准C运行库中所有有需要的函数使用。而且这块内存区域的创建就是由C/C++运行库函数_beginthreadex()来负责的。
       所以正如上述几位所说,_beginthreadex的安全性是相对较高的。

发表于 2018-01-11 14:03:04 回复(0)
答案  B 
如果在代码中有使用标准C运行库中的函数时,尽量使用 _beginthreadex() 来代替 CreateThread()
发表于 2015-01-15 10:47:56 回复(0)
表示不知道这个知识点。。。
发表于 2018-02-09 23:04:18 回复(0)
_beginthreadex和_beginthread在回调入口函数之前进行一些线程相关的CRT的初始化操作。 CRT:C运行时库
编辑于 2017-10-24 15:57:49 回复(0)
线程知识点。
发表于 2017-04-01 00:21:24 回复(0)
  _beginthreadex()比较于 CreateThread()有更高的线程安全性,不会造成多个线程共用同一个全局变量的情况
发表于 2017-01-24 12:21:55 回复(1)
_beginthreadex安全性相对较高
发表于 2016-10-20 21:54:21 回复(0)
安全性
发表于 2016-03-17 01:07:00 回复(0)