进程与线程 线程的创建方式

网友投稿 767 2022-09-05

进程与线程 线程的创建方式

进程与线程 线程的创建方式

C++创建新线程的四种方式:

方式一(不推荐):CreateThread(记得关闭线程句柄) CreateThread是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象。

HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性,在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE。因此一般使用NULL

SIZE_T dwStackSize, // 线程堆栈大小 设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小

LPTHREAD_START_ROUTINE lpStartAddress, // 线程函数地址 指向线程函数的指针,形式:@函数名,函数名称没有限制, LPVOID lpParameter, // 线程函数参数 是一个指向结构的指针,不需传递参数时,为NULL

DWORD dwCreationFlags, // 指定线程是否立即启动 一般取值为0(立即激活)或者为)CREATE_SUSPENDED(0x00000004)挂起线程 LPDWORD lpThreadId // 存储线程ID号 );

返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL。

创建方式的缺点:使用这种方法可能会引发内存泄漏问题,不推荐,推荐使用方式三

方式二(简单):_beginthread()

_Beginthread函数创建一个在start_address开始执行例程的线程。 当线程从该例程返回时,就会自动终止。使用此函数必须包含头文件 #include

这个函数看起来过于简单,他无法做到线程的挂起状态。另外重要的一点是,它所产生出来的线程所做的第一件事情就是关闭掉handle,所以由它所返回的handle可能可用,也可能不可用

方式三(推荐,安全度高):_beginthreadex(需要关闭线程句柄) uintptr_t _beginthreadex( // NATIVE CODE void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr ); 1 2 3 4 5 6 7 8 需要使用头文件#include 需要的设置:ProjectàSetting–>C/C+±->User run-time library 选择Debug Multithreaded 或者Multithreaded。即使用: MT或MTD。退出时需要使用_endthreadex(handle);

方式四:AfxBeginThread(会自动释放的,不用你去释放) AfxBeginThread一个计算机函数,功能是创建用户界面线程和工作者线程。 常见用法是AfxBeginThread(ThreadProc,this)。比较常见的就是在MFC里面使用。两者的区别在于用户页面能够处理消息响应,而后者工作者线程则不能。

主要介绍工作者线程:

LPVOID pParam,//传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程.

int nPriority,//优先级

UINT nStackSize,//堆栈大小 DWORD

dwCreateFlags,//创建标识,是否挂起 LPSECURITY_ATTRIBUTES lpSecurityAttrs//安全属性 ) 一个是线程函数的指针,一个是传递给这个函数的参数。

实际中我们经常这样用 AfxBeginThread(ThreadProc,this);//把this传过去,就可以调用类的成员了. 这样线程函数就可以使用和操作类的成员了。千万要注意线程函数是静态类函数成员。当然也可以把this换成别的结构体指针,效果一样。

UINT MyThreadProc( LPVOID pParam ) { return 0; }​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据库审计 - 网络安全的重要组成部分
下一篇:主从配置,读写分离是MySQL性能优化重点(mysql主从配置详解)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~