windows系统中创建线程常用哪几个函数,有什么区别?

windows系统中创建线程常用哪几个函数?

在windows系统中创建线程的函数有:

CreadThread,AfxBeginThread,_beginthread,_beginthreadex。

 

他们的区别在于使用的场景不同。

 

CreateThread是Windows的API函数(SDK函数的标准形式,直截了当的创建方式,任何场合都可以使用),提供操作系统级别的创建线程的操作,且仅限于工作者线程。不调用MFC和RTL的函数时,可以用CreateThread,其它情况不要轻易。在使用的过程中要考虑到进程的同步与互斥的关系(防止死锁)。线程函数定义为:DWORD WINAPI _yourThreadFun(LPVOID pParameter)。但它没有考虑:
(1)C Runtime中需要对多线程进行纪录和初始化,以保证C函数库工作正常(典型的例子是strtok函数)。
(2)MFC也需要知道新线程的创建,也需要做一些初始化工作(当然,如果没用MFC就没事了)。   

AfxBeginThread:MFC中线程创建的MFC函数,首先创建了相应的CWinThread对象,然后调用CWinThread::CreateThread,   在CWinThread::CreateThread中,完成了对线程对象的初始化工作,然后,调用_beginthreadex(AfxBeginThread相比较更为安全)创建线程。它简化了操作或让线程能够响应消息,即可用于界面线程,也可以用于工作者线程,但要注意不要在一个MFC程序中使用_beginthreadex()或CreateThread()。线程函数定义为:UINT _yourThreadFun(LPVOID pParam)

_beginthreadex:MS对C Runtime库的扩展SDK函数,首先针对C Runtime库做了一些初始化的工作,以保证C Runtime库工作正常。然后,调用CreateThread真正创建线程。  仅使用Runtime Library时,可以用_BegingThread。

小节:

    实际上,这三个函数之间存在一定的调用关系,第一个纯粹一些,后两个完成自己相应的工作之后,调用前者实现线程的创建。其中CreateThread是由操作系统提供的接口,而AfxBeginThread和_BeginThread则是编译器对它的封装。

    用_beginthreadex()、_endthreadex函数应该是最佳选择,且都是C Run-time Library中的函数,函数的参数和数据类型都是C Run-time Library中的类型,这样在启动线程时就不需要进行Windows数据类型和C Run-time Library中的数据类型之间的转化,从而,减低了线程启动时的资源消耗和时间的消耗。但使用_beginthread,无法创建带有安全属性的新线程,无法创建暂停的线程,也无法获得 线程ID,_endthread的情况类似,它不带参数,这意味这线程的退出代码必须硬编码为0。

    MFC也是C++类库(只不过是Microsoft的C++类库,不是标准的C++类库),在MFC中也封装了new和delete两中运算符,所以用到new和delete的地方不一定非要使用_beginthreadex() 函数,用其他两个函数都可以。
 

    理解了这些,就知道什么时候该用什么函数创建线程了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.lang.String小测试

还记得java.lang.String么,如果现在给你一个小程序,你能说出它的结果么 1 public static String ab(String a){2 return a "b";3 }4 5 public static void testAb(){6 String x "a";7 ab…

Oracle传输表空间

一、简介 可传输表空间(还有个集)最大的优势是其速度比export/import或unload/load要快的多。因为可传输表空间主要是复制数据文件到目标路径,然后再使用export/import或Data Pump export/import等应用仅导出/导入表空间对象的元数据到新数据库。 (1&…

进程控制块PCB结构体 task_struct 描述

进程控制块,英文名(Processing Control Block),简称 PCB 。 进程控制块是系统为了管理进程设置的一个专门的数据结构,主要表示进程状态。 每一个进程都对应一个PCB来维护进程相关的信息; 在Linux中&#xf…

基于OpenCV与tensorflow实现实时手势识别

基于OpenCV与tensorflow object detection API使用迁移学习,基于SSD模型训练实现手势识别完整流程,涉及到数据集收集与标注、VOC2012数据集制作,tfrecord数据生成、SSD迁移学习与模型导出,OpenCV摄像头实时视频流读取与检测处理&a…

学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程

立即学习:https://edu.csdn.net/course/play/24458/296440?utm_sourceblogtoedu 1.Thread其他的属性 CurrentThread().getName():获得当前线程的名字 t.is_Alive:判断线程是否还在运行 t.join():等待线程运行结束再执行join后面的代码 t.setName("name"):为线程…

AIX主机信任关系配置

1.配置主机信任关系的时候,需要先在两台主机/etc/hosts文件中添加要信任主机的IP,假设有(192.168.8.190 aix190,192.168.8.191 aix191)2个主机,在191主机配置如下所示 192.168.8.190 aix190 2.如果系统配置DNS,则需要去…

Sprint2团队贡献分

团队贡献分: 郭志豪:31% http://www.cnblogs.com/gzh13692021053/ 杨子健:22%http://www.cnblogs.com/yzj666/ 谭宇森:23%http://www.cnblogs.com/yzj666/ 刘森松:24% http://www.cnblogs.com/lssh/转载于:https://w…

学习笔记(26):Python网络编程并发编程-GIL与自定义互斥锁的区别

立即学习:https://edu.csdn.net/course/play/24458/296443?utm_sourceblogtoedu 1.GIL的基本概念 答:GIL本质上就是一把锁,只是他是一把在python解释器上的锁 2.GIL与互斥锁的区别 答: 1)GIL保护的是在python解释器上的参数&a…

多目标跟踪检测

方法: 1、实时性,每帧视频10ms 2、方法,首先深度学习检测到目标,然后再写跟踪算法

2014年最具人气国外WORDPRESS主题

在国外,WrodPress这个博客系统极为受欢迎,使用WordPress来建站可以降低很多成本,另外还能以十分便宜的价格获得一个漂亮的WP网站模板。 今天向大家分享来自Themeforest 2014年最具人气的高级WrodPress主题,这些主题无论是设计还是…

软件工程学习感想

通过这半学期我对软件工程的学习,从软件工程的基础到考试用户的需求分析与求解,最后到黑盒白盒测试通过自身做过的一些案例,讲解了软件工程这门本身枯燥乏味的课程,这不仅增强了学生学习的积极性,也通过让我们自己去做…

开源视觉salm算法介绍

当前的开源SLAM方案 开源方案传感器形式地址链接MonoSLAM单目https://github.com/hanmekim/SceneLib2 PTAM单目 http://www.robots.ox.ac.uk/~gk/PTAM/ORB-SLAM 单目为主http://webdiis.unizar.es/~raulmur/orbslam/ORB-SLAM2单目https://github.com/raulmur/ORB_SLAM2LSD-SLAM…

学习笔记(27):Python网络编程并发编程-GIL与多线程

立即学习:https://edu.csdn.net/course/play/24458/296444?utm_sourceblogtoedu GIL与多线程 1.须知: 1)cpu主要是为了提升计算性能,增加CPU提升计算性能; 2)每一个CPU一旦遇到阻塞状态都会处于等待状态&#xff0c…

J0ker的CISSP之路:复习-Access Control(3)

本文同时发表在:[url]http://netsecurity.51cto.com/art/200801/63649.htm[/url] 在《J0ker的CISSP之路》系列的上一篇文章里,J0ker给大家介绍了访问控制CBK里面一些常见的破坏信息资产保密性的威胁类型,那么什么类型的威胁会破坏信息资产的完…

C#中对泛型List进行分组输出元素

背景:在输出列表时,往往需要按照某一字段进行分组,比如在输出城市列表时,按照首字母进行分组,输出学生列表时,按照年级进行分组,然后再对分组的结果按照其他的字段进行排序。 如存在以下STU学生…

分页3

http://www.cnblogs.com/ChrisLee2011/p/4288194.html 页面的HTML部分如下&#xff1a; < div class "tableContainer"> < input id "currentPage" type "hidden" value " ViewData[ "currentPage"] "/> < i…

最优化课堂笔记01: 第一章 最优化的基本概念

第一章 最优化的基本概念 1.最优化求解的数学模型建立 2.例题&#xff08;考试第一大题&#xff1a;数学模型建立&#xff09; 解析&#xff1a;优化变量、目标函数&#xff08;一般取最小化&#xff09;、约束条件 注意&#xff1a; 1&#xff09;约束条件一般形式为&#…

面向对象中构造函数的小练习

//写一个Ticket类&#xff0c;有一个距离属性&#xff08;本属性只读&#xff0c;在构造方法中赋值&#xff09;&#xff0c;不能为负数//有一个价格属性&#xff0c;价格属性为只读&#xff0c;并且根据距离distance计算价格Price(1元/公里)//0--100公里 票价不打折//101-20…

EIGRP非等价负载均衡

1、等价负载均衡 当到达目的地有多条路径时&#xff0c;而有多条路径的metric值一样&#xff0c;这时就可以做等价负载均衡&#xff0c;让数据包均衡转发&#xff0c;不过要看该路由器的转发方式&#xff0c;如果是快速转发方式&#xff0c;这种方式无用&#xff08;本地产生的…

ubuntu100%快速安装搜狗输入法

1、进入搜狗官方网站&#xff0c;下载最新版本的for ubuntu输入法deb安装包 2、下载完成以后&#xff0c;进入下载好的文件目录&#xff0c;在空白处点击鼠标右键&#xff0c;打开终端 在终端窗口输入如下的指令开始安装搜狗拼音输入法。 #sudo dpkg -i sogoupinyin_2.2.0.01…