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

来源:互联网 发布:青岛工资知乎 编辑:程序博客网 时间:2024/06/05 05:37
 

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

线程

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,从而递减对象的使用计数

【文尾】如果这篇文章对您有帮助,请留下您的祝福。谢谢~~
原创粉丝点击