Windows核心编程<读书笔记六> 线程

本文详细阐述了线程的基本概念、线程的创建与管理方法、以及线程函数的实现细节,旨在帮助开发者更高效地利用线程解决编程问题。主要内容包括线程的组成部分、线程开销与进程的比较、创建线程的方法、线程函数的编写规范、终止线程的多种方式、使用_beginthreadex函数创建线程的注意事项、创建多线程应用的技巧、获取进程或线程内核对象的方法、获取进程ID或线程ID的步骤、将伪句柄转换为实句柄的操作等。
 

【文起】亲爱的,想一觉醒来了我就在你身边,爱你。奋斗

线程

1、  每个进程至少有一个线程。线程包含:1、线程内核对象;2、线程堆栈(用户维护线程执行代码时需要的所有函数参数和局部变量)

2、  线程需要的开销比进程少,所以尽量应该设法用增加线程来解决编程问题,而非创建新的进程。当然有些时候多个进程更为合理。

3、  编写第一个线程函数。每个线程都必须从进入点函数开始执行,主线程进入点函数是:main、wmain、WinMain、wWinMain

我们的辅助线程,进入点函数如:

DWORD WINAPI ThreadFunc(PVOID pvParam)

线程函数执行任务,到达结尾处并返回。这是线程终止运行,堆栈的内存也释放,同时线程的内核对象使用计数被递减,如果计数降为0,线程的内核对象就会被撤销。

4、  CreateThread函数

之前我们通过CreateProcess函数来创建进程的主线程,如果需要创建一个或者多个辅助函数,那么只要让一个已经在运行的线程来调用CreateThread函数即可。

[注]该函数使用来创建线程的Windows函数,我们Visual C++运行期库函数_beginthreadex

5、  终止线程运行:(跟进程的终止方式比较像哦)

A.      线程函数返回(最好使用这种方法)

B.      通过调用ExitThread函数,线程执行撤销

C.      用同一个进程或者另一个进程中的线程调用TerminateThread函数

D.      包含线程的进程终止运行。

6、  TerminateThread函数,与TerminateProcess一样

7、  _beginthreadex一些要点:

A、 每个线程均获得由C/C++运行期库的堆栈分配的自己的tiddata内存结构

B、 传递给该函数的线程函数的地址保存在tiddate内存块中,传给该函数的参数也保持在该数据块中

C、 _beginthreadex确实从内部调用了CreateThread,因为这是操作系统了解如何创建新线程的唯一方法

D、 当调用CreateThead时,它被告知通过调用_threadstartex而不是pfnStartAddr来启动执行新进程。

E、  如果成功,会像CreateThread一样返回线程句柄,否则返回NULL

8、  如果想创建一个多线程应用程序,记得在编译器命令行上设定/MT或者/MD开关

9、  获取进程或者线程内核对象

HANDLE GetCurrentProcess();         HANDLE GetCurrentThread()

这两个函数都是返回伪句柄。且使用计数不会有任何影响,如果将伪句柄作为参数传递给CloseHandle(),该函数会忽略调用并返回FALSE

10、              获取进程ID或者线程ID

DWORD GetCurrentProcessId();     DWORD GetCurrentThreadId();

11、              将伪句柄转换为实句柄

线程的伪句柄是当前线程的句柄。所以有时候需要转换为实句柄进行操作

函数DuplicateHandle可以执行这一转换

使用该函数会递增特定对象的使用计数,所以完成使用句柄时,应该将该句柄传递给CloseHandle,从而递减对象的使用计数

【文尾】如果这篇文章对您有帮助,请留下您的祝福。谢谢~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值