[转载]关于_beginthreadex和CreateThread的区别

湿敏电阻HR202的两种驱动方案实测:IO充放电法 vs. 交流方波ADC法,哪个更适合你? 本文深入评测湿敏电阻HR202的两种驱动方案:IO充放电法和交流方波ADC法。通过原理图分析、精度实测和资源占用对比,揭示交流方波ADC法在精度和稳定性上的优势,特别适合长期监测场景。同时提供IO充放电法在资源受限情况下的应用建议,帮助工程师根据项目需求做出最优选择。 阅读详情

关于_beginthreadex和CreateThread的区别

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

所以,如果你的编程只调用 Win32 API/SDK ,就放心用 CreateThread;如果要用到
C++ 运行时间库,那么就要使用 _beginthreadex ,并且需要在编译环境中选择 Use
MultiThread Lib/DLL。

C++ 运行期库有两个创建线程的函数,另一个是 _beginthread, 它们两者的区别请
自己去看MSDN:

通常他们的解释都是这容易造成内存泄漏。这个解释本身是没有错的,但是解释得不够完全和详 细。以至于造成很多新手盲目的信任了那句话,在那里都是用_beginthreadex函数,或者是装作没有看到使用CreateThread函数。曾经 有一段时间我也对这个问题很是困惑,不知道到底用那个才是对的。因为我不止一次在很多权威性的代码中看到对CreateThread函数的直接调用。难道 是权威错了?? 抱着怀疑的态度查找了大量的资料和书籍,终于搞明白了这个问题的关键所在,在此做个说明,算是对那句话的一个完善。

关于_beginthreadex和CreateThread的区别我就不做说明了,这个很 容易找到的。我们只要知道一个问题:_beginthreadex是一个C运行时库的函数,CreateThread是一个系统API函 数,_beginthreadex内部调用了CreateThread。只所以所有的书都强调内存泄漏的问题是因为_beginthreadex函数在创 建线程的时候分配了一个堆结构并和线程本身关联起来,我们把这个结构叫做tiddata结构,是通过线程本地存储器TLS于线程本身关联起来。我们传入的 线程入口函数就保存在这个结构中。tiddata的作用除了保存线程函数入口地址之外,还有一个重要的作用就是:C运行时库中有些函数需要通过这个结构来 保存和获取一些数据,比如说errno之类的线程全局变量。这点才是最重要的。

当一个线程调用一个要求tiddata结构的运行时库函数的时候,将发生下面的情况:

运行时库函数试图TlsGetv alue获取线程数据块的地址,如果没有获取到,函数就会 现场分配一个 tiddata结构,并且和线程相关联,于是问题出现了,如果不通过_endthreadex函数来终结线程的话,这个结构将不会被撤销,内存泄漏就会出 现了。但通常情况下,我们都不推荐使用_endthreadex函数来结束线程,因为里面包含了ExitThread调用。

找到了内存泄漏的具体原因,我们可以这样说:只要在创建的线程里面不使用一些要求tiddata结构的运行时库函数,我们的内存时安全的。所以,前面说的那句话应该这样说才完善:

“绝对不要调用系统自带的CreateThread函数创建新的线程,而应该使用_beginthreadex,除非你在线程中绝不使用需要tiddata结构的运行时库函数”

这个需要tiddata结构的函数有点麻烦了,在侯捷的《win32多线程程序设计》一书中这样说到:

”如果在除主线程之外的任何线程中进行一下操作,你就应该使用多线程版本的C runtime library,并使用_beginthreadex和_endthreadex:

1 使用malloc()和free(),或是new和delete

2 使用stdio.h或io.h里面声明的任何函数

3 使用浮点变量或浮点运算函数

4 调用任何一个使用了静态缓冲区的runtime函数,比如:asctime(),strtok()或rand()

Qt C++ + Qt 3D 的数字孪生工厂 以下是一个基于 **Qt C++ + Qt 3D** 的数字孪生工厂完整源码示例,集成了 **Qt 3D** 产线建模和 **WebSocket** 实时数据交互。ui->qualifiedProductsLabel->setText(QString("合格产品: %1").arg(data.qualifiedProducts));ui->totalProductsLabel->setText(QString("总产量: %1").arg(data.totalProducts)); 阅读详情

相关推荐

VMD分子可视化实战:5个隐藏技巧让你的科研图像秒变顶刊级别

本文深入探讨了VMD分子可视化软件在科研图像美化中的5个高阶技巧,旨在帮助研究者将分子结构图提升至顶刊级别。内容涵盖原子色彩与材质的艺术化定制、沉浸式分子环境构建、专业构图与视角控制、数据驱动的动态可视化以及自动化工作流建立,通过精细的色彩映射、光照调整、周期性边界展示和脚本自动化,显著增强图像的科学叙事性与视觉冲击力。

weixin_29240343的博客 420

windows线程之CreateThread与_beginthreadex区别详解

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

new9232的博客 2295

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

(P102)多线程三:_beginthreadex,CreateThread与_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函数都不是线程安全的。

喜欢打篮球的普通人 1199

卡诺图化简法注意事项+竞争冒险知识点总结

今天反思以下卡诺图化简法中的注意事项。 卡诺图看起来简单,但如果不熟悉的话很容易出错,因此要对画圈的规则比较熟悉。

weixin_42415266的博客 1万+

高通8155车机系统里,安卓和QNX是怎么‘打电话’的?聊聊HAB通信框架那些事

本文深入解析了高通8155车机系统中HAB通信框架如何实现安卓与QNX的高效协同。作为异构系统的通信桥梁,HAB通过共享内存和中断信号机制,在多媒体数据传输中展现出零拷贝、硬件加速等优势,成为智能座舱实现实时性与生态丰富性平衡的关键技术。

weixin_42715608的博客 381

_beginthreadex CreateThread _beginthread

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

路在脚下 618

Python地理空间数据库之geopandas使用详解

地理空间数据分析在许多领域中都有着广泛的应用,包括地理信息系统(GIS)、城市规划、环境科学、地质勘探等。Python GeoPandas是一个强大的库,旨在简化地理空间数据的处理和分析。本文将深入介绍GeoPandas库,包括其基本概念、功能特性、示例代码以及在实际应用中的应用场景。

Rocky006的博客 1万+

【一文搞懂】【WIN32】(_beginthread、_beginthreadex)和CreateThread

_beginthreadex和CreatThread

此地无银 2298

成功解决raise Py4JError py4j.protocol.Py4JError: py4j.protocol.Py4JError: Could not find py4j jar at 

成功解决raise Py4JError("Could not find py4j jar at {0}".format(jarpath)) py4j.protocol.Py4JError: Could not find py4j jar at 目录 解决问题 解决思路 解决方法 1、第一步安装jdk 2、第二步安装或升级py4j 解决问题 raise Py4JError("Could not find py4j jar at {0...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4624

深入Netflix影片分类数据抓取的Python爬虫实战:反反爬机制绕过与Playwright应用全解析

技术工具用途Playwright控制真实浏览器模拟用户行为开发语言asyncio异步调度浏览器任务pandas数据处理和导出sqlite3本地数据库存储支持随机UA模拟,增强反爬能力为什么选择 Playwright?✅ 支持多浏览器(Chromium、Firefox、WebKit)✅ 原生支持 Python 异步编程✅ 提供截图、滚动模拟、验证码处理等高级功能✅ 反爬能力强,模拟真实用户访问。

2201_76125261的博客 1239

_beginthreadex和CreateThread

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

u011261959的专栏 812

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

【转载】CreateThread与_beginthreadex本质区别

转载文章,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7421759 本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编...

112

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别

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

miyunhong的专栏 2343

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

_beginthreadex()和CreateThread()的区别 为什么不用_beginthread()?

如果在代码中会调用C中的标准库函数,我们最好使用_beginthreadex(),因为在用到标准库函数时,会用到一些全局变量,如errno,很多库中的函数调用出错时,会将错误信息赋给这个变量,这样会方便调试。 但是如果我们开两个线程A,B,如果A中的标准库函数报错了,把错误信息赋给errno,这样线程B用到errno时,就会报错。当然这种情况我们应该尽量避免。 _beginthreadex()

飞翔在北京的博客 667

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【程序设计】CreateThread()与_beginthreadex()的区别

CreateThread()与_beginthreadex()的区别

Cout_Sev 842

多线程--CreateThread与_beginthreadex本质区别

转载 MoreWindows: 秒杀多线程第二篇 本文将带领你与多线程作第一次亲密接触,并深入分析 CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答 CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用 CreateThread还是 _beginthreadex? 使用多线...

XIEXINGHUA2010的博客 191

CreateThread、_beginthread和_beginthreadex

<br />(1)全局变量echoLabel的使用,由于收发消息都在work线程中执行,且wok线程与主线程间的通信用的是SendMessage,暂时不会有问题,但有隐患;<br />(2)由SENDMEG结构体组成的链表的使用,用两个指针分别指向链表的头尾。在主线程中Insert节点,在work线程中Delete节点,问题就出现在这两个函数中对两个指针的操作。<br />  CreatThread 与 _beginthreadex这三个函数的区别<br />  CreatThread是Win32 API函

上善若水 水养金鱼 2178

015 _beginthreadex CreateThread 函数区别

_beginthreadex讲解● _beginthreadex   ○ 纯 C/C++ API     ○ 多线程这一块的运行库   ○ C语言的错误处理机制 errno     ○ 3条     ○ 线程变得不安全了   _beginthreadex();  //要比CreateThread 安全尽量使用_beginthreadex(); 创建线程     //分配空间  ...

afqz46812的博客 92

_beginThreadex的用法&&以及其和CreateThread之间的区别

本文转载了网易博客 tfn2008@yeah的博客 在此感谢博主的辛勤

loveRooney的专栏 1028

CreateThread和_beginthreadex区别

二、解释 (1)如果你正在编写C/C++代码,决不应该调用CreateThread。相反,应该使用VisualC++运行期库函数_beginthreadex,退出也应该使用_endthreadex。如果不使用Microsoft的VisualC++编译器,你的编译器供应商有它自己的CreateThread替代函数。不管这个替代函数是什么,你都必须使用。 (2)因为_beginth

HLW0522的博客 641

【转】AfxBeginThread和CreateThread具体区别

1. 具体说来,CreateThread这个 函数是windows提供给用户的 API函数,是SDK的标准形式,在使用的过程 中要考虑到进程的同步与互斥的关系,进程间的同步互斥等一系列会导致操作系统死锁的因素,用起来比较繁 琐一些,初学的人在用到的时候可能会产生不可预料的错误,建议多使用AfxBeginThread,是编译器对原来的 CreateThread函数的封装,用与MFC编...

adqk62684的博客 248

CreateThread, AfxBeginThread,_beginthread, _beginthreadex

CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别时间:2009-09-29 22:42:23来源:网络 作者:未知 点击:546次 CreateThread是Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函

lekonpeng的专栏 1001

小解_beginthreadex与_beginthreadex和CreateThread的区别

为什么用_beginthreadex而不用CreateThread函数原因: 1.主要考虑的是线程上下文的切换,如果一个线程设置了全局变量erron 此时它的执行挂起或者中断了,进程执行其他线程去了正好它调用了C/C++运行库创建了相同名字的全局变量,拿回来后之前的全局变量改了值就会出错,所以我们最好用局部变量,线程需要自己的一个自己的数据结构去存储这个全局变量这样其他线程改变时影响不到它,这恰...

weixin_34363171的博客 172

CreateThread与_beginthreadex本质区别

原文出处:http://blog.youkuaiyun.com/morewindows/article/details/7421759 CreateThread的接口如下: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD SIZE_T dwStackSize, // initial stack s

logarrow的专栏 780
上一篇: win32控制台空项目使用MFC多线程
下一篇: 函数模板----template<typename T>/ ttemplate<class T>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值