_beginthreadex 与 createthread 的区别

windows线程之CreateThread_beginthreadex区别详解 lpThreadAttributes :线程安全属性,一般设置为NULLdwStackSizeL :指定线程可以为其线程栈使用多少地址空间。一般传入0,由编译器自行去分配。lpStartAddress:线程函数地址lpParameter:传递给线程函数的参数dwCreationFlags:控制线程创建。如果值为0,线程创建后立即就进行调度。值为CREATE_SUSPENDED,系统将创建并初始化线程,但是会暂停该线程运行,这样它就无法进行调度。一般我们传入0。...... 阅读详情

_beginthreadex : CRT提供的库函数

createthread:windows 提供的API 

实现的功能都是创建一个线程,线程的入口函数有少许不一致。


内部实现细节也是有差异的:

CreateThread、_beginthread和_beginthreadex都是用来启动线程的,但大家看到oldworm没有提供_beginthread的方式,原因简单,_beginthread是_beginthreadex的功能子集,虽然_beginthread内部是调用_beginthreadex但他屏蔽了象安全特性这样的功能,所以_beginthread与CreateThread不是同等级别,_beginthreadex和CreateThread在功能上完全可替代,我们就来比较一下_beginthreadex与CreateThread!

CRT的函数库在线程出现之前就已经存在,所以原有的CRT不能真正支持线程,这导致我们在编程的时候有了CRT库的选择,在MSDN中查阅CRT的函数时都有:
Libraries
LIBC.LIB Single thread static library, retail version 
LIBCMT.LIB Multithread static library, retail version 
MSVCRT.LIB Import library for MSVCRT.DLL, retail version 
这样的提示!
对于线程的支持是后来的事!
这也导致了许多CRT的函数在多线程的情况下必须有特殊的支持,不能简单的使用CreateThread就OK。
大多的CRT函数都可以在CreateThread线程中使用,看资料说只有signal()函数不可以,会导致进程终止!但可以用并不是说没有问题!

有些CRT的函数象malloc(), fopen(), _open(), strtok(), ctime(), 或localtime()等函数需要专门的线程局部存储的数据块,这个数据块通常需要在创建线程的时候就建立,如果使用CreateThread,这个数据块就没有建立,然后会怎样呢?在这样的线程中还是可以使用这些函数而且没有出错,实际上函数发现这个数据块的指针为空时,会自己建立一个,然后将其与线程联系在一起,这意味着如果你用CreateThread来创建线程,然后使用这样的函数,会有一块内存在不知不觉中创建,遗憾的是,这些函数并不将其删除,而CreateThread和ExitThread也无法知道这件事,于是就会有Memory Leak,在线程频繁启动的软件中(比如某些服务器软件),迟早会让系统的内存资源耗尽!

_beginthreadex(内部也调用CreateThread)和_endthreadex就对这个内存块做了处理,所以没有问题!(不会有人故意用CreateThread创建然后用_endthreadex终止吧,而且线程的终止最好不要显式的调用终止函数,自然退出最好!)

谈到Handle的问题,_beginthread的对应函数_endthread自动的调用了CloseHandle,而_beginthreadex的对应函数_endthreadex则没有,所以CloseHandle无论如何都是要调用的不过_endthread可以帮你执行自己不必写,其他两种就需要自己写!(Jeffrey Richter强烈推荐尽量不用显式的终止函数,用自然退出的方式,自然退出当然就一定要自己写CloseHandle)

(P102)多线程三:_beginthreadexCreateThread_beginthreadex区别,线程类封装 文章目录 F1查看帮助 为啥_beginthreadex()比CreateThread()好呢? (1)_beginthreadex是多线程版的C runtime library中的一个函数; _beginthreadex包裹了CreateThread; C runtime library是分为单线程版本的runtime library和多线程版本的runtime library (2)malloc free fopen strtok等等这些C runtime library函数都不是线程安全的。 阅读详情

相关推荐

CreateThread_beginthreadex本质区别

点击打开原文链接 一、预热: 下面这个程序的主线程会创建了一个子线程并等待其运行完毕,子线程就输出它的线程ID号然后输出一句经典名言——Hello World。整个程序的代码非常简短,只有区区几行。 //最简单的创建多线程实例 #include <stdio.h> #include <windows.h> //子线程函数 DWORD WINAPI ThreadFun...

mpp_king的博客 410

_beginthreadex CreateThread _beginthread

>中有很详细地介绍。  _beginthreadex是微软的C/C++运行时库函数,CreateThread是操作系统的函数。 _beginthreadex通过调用CreateThread来实现的,但比CreateThread多做了许多工作。 注意:若要创建一个新线程,绝对不要使用CreateThread,而应使用_beginthreadex. 因为:考虑标准C运行时库的一些变量和函数,如

路在脚下 617

_beginthreadexCreateThread

在多线程环境中会出问题的C/C++运行库变量和函数有errno,_doserrno,strtok,_wcstok, strerror,_strerror,tmpnam,tmpfile,asctime,_wasctime,gmtime,_ecvt和_fcvt等等。 为了保证C和C++多线程应用程序正常运行,必须创建一个数据结构,并使之使用了C/C++运 行库函数的每个线程关联。然后,在

u011261959的专栏 810

关于CreateThread和_beginthreadex区别联系

 1.简单来说CreateThread是Windows下用于创建线程的系统API,_beginthreadex则是Visual C++运行时库函数 2._beginthreadex会在内存堆上分配一个线程相关的数据块,而CreateThread不会分配该数据块 3.如果调用strtok、strerror、gmtime等等,会分配线程相关的数据块。当线程退出时,用_beginthread

ityezi_admin的专栏 608

CreateThread 和_beginthreadex区别

本文将带领你多线程作第一次亲密接触,并深入分析CreateThread_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex?      使用多线程其实是非常容易的,下面这个程序的主线程会创建了

Keep Moving~ 922

[转载]关于_beginthreadexCreateThread区别

关于_beginthreadexCreateThread区别 在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是 C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局 量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全 的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立 的“全局”量。 所以,如果你的编程只调用 Win

明月清风 精进不止 231

_beginthreadexCreateThread,AfxBeginThread的区别

在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。所以,

六石 790

beginthread beginthreadex CreateThread 区别

建立一个线程。unsigned long beginthread(void(cdecl *startaddress)(void*),unsigned stacksize, void *arglist);unsigne dlong beginthreadex(void *security,unsignedstacksize,unsigned(stdcall *startaddress) (void

枯藤老树昏鸦,小桥流水人家 867

CreateThread_beginthreadex的本质区别

CreateThread函数原型:HANDLEWINAPICreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, ...

KnightOnHorse的博客 224

CreateThread, AfxBeginThread,_beginthread, _beginthreadex区别

一、转载自: http://www.cnblogs.com/chuncn/archive/2009/03/08/1406096.htmlCreateThread是Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使

miyunhong的专栏 2338

_beginthreadex()CreateThread()函数的区别

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

EffortForever 967

_beginThreadex CreateThread区别

///本文用于学习记录 在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是 C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局 量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全 的问题。而 _beginthreadex 为这些全局变量

u011833307的专栏 480

关于_beginthreadexCreateThread区别

在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。所以,如果你的编程只调用 Win32 API/SDK ,就放心用 CreateThread;如果要用到C++ 运行时间

SomeTimes 912

_beginthreadexCreateThread区别和联系

今天无聊, 点了一下CSDN首页右下角的一周技术文章点击Top9, 基本都是intel博客大赛的文章, 其中有一篇: Win32 多线程的创建方法和基本使用, 其中提到了CreateThread内存泄露的问题, 详见: http://wenku.baidu.com/view/adede4ec4afe04a1b071dea4.html或http://dl.dbank.com/c03ljl2i

shines77 的博客 9405

C++多线程系列(一)CreateThread和_beginthreadex区别

现在在学习多线程,顺便将搜集到的资料整理下来以供参考和查询。 首先在开始多线程学习的时候遇到的首要问题便是多线程的创建,在查阅资料后有CreateThread和_beginthreadex两种方法,可能不止这两种,以后学习到了再补充。

烟雨博客 3369
上一篇: How to use ppt to make an effective presentation
下一篇: windows 获取操作系统版本信息
wcppcw
博客等级 码龄17年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值