Windows环境下多线程编程原理与应用读书笔记(3)————Windows环境中的多线程实现(1)

<一>Windows系统中与线程有关的基本Win32 API函数表

函数 说明
CreateThread() 创建一个新的线程
CreateRemoteThread() 在另一个线程中创建一个新的线程 
ExitThread() 正常地结束一个线程
TerminateThread() 中止一个线程的执行
GetExitCodeThread() 得到另一个线程的退出码
Get/SetThreadPriority()  得到/设置线程的优先级
SuspendThread()/ResumeThread() 挂起线程/重启一个线程
CloseHandle() 关闭一个线程的句柄

以上各个函数的具体使用规则敬请查看Win32 API手册,其中有详细的使用方法,再次只是记录一下,起到提示的作用。

需要注意的地方:

  1. CreateThread函数会返回的句柄HANDLE和函数中参数lpThreadId,这两个量都可以用来标识一个线程,它们的区别是:句柄对线程对象有完全的访问权限。句柄可以被子线程继承,线程句柄在关闭之前一直有效(即使是句柄所代表的线程已经被终止),因此必须显示的调用CloseHandle函数来关闭一个句柄。而线程ID从线程创建到线程终止才有效,无需显示清除。
  2. TerminateThread函数的使用需要特别注意,当调用该函数时,被终止的线程立即结束运行,线程就来不及释放资源。所以除非程序员很清楚线程代码的执行,否则不能用这个函数。
  3. ExitThread函数被调用时,系统就会释放线程的资源,结束线程,并释放相应的动态链接库。此时线程ID也要被释放。如果线程是进程中的最后一个线程,则进程也会终止。

<二>进程和线程的优先级说明

进程和线程的优先级说明 
进程优先级 含义
ABOVE_NORMAL_PRIORITY_CLASS 该优先级高于NORMAL_PRIORITY_CLASS但低于HIGH_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS 该优先级高于IDLE_PRIORITY_CLASS但低于NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS 该优先级高于IDLE_PRIORITY_CLASS和NORMAL_PRIORITY_CLASS,用来对实时性要求较高,需要立即执行的进程
IDLE_PRIORITY_CLASS 设置了该优先级的进程中的线程只有在系统处于空闲时才会得到执行。屏幕保护程序就是此种优先级进程的一个例子
NORMAL_PRIORITY_CLASS 用于没有特殊调度要求的一遍线程
REALTIME_PRIORITY_CLASS

进程调度优先级高于其他所有优先级类型。该进程内的线程抢占所有其他进程中的线程

线程优先级                                   

含义
THREAD_PRIORITY_ABOVE_NORMAL 线程的优先级比其所在的进程优先级高1
THREAD_PRIORITY_BELOW_NORMAL 线程的优先级比其所在的进程优先级低1                                                                                                                     
THREAD_PRIORITY_HIGHEST 线程的优先级比其所在的进程优先级高2
THREAD_PRIORITY_IDLE 如果线程包含在HIGH_PRIORITY_CLASS或更低的进程内,线程的基本优先级为1;如果线程包含在REALTIME_PRIORITY_CLASS进程内,其基本优先级为6
THREAD_PRIORITY_LOWEST 线程的优先级比其所在的进程优先级低2
THREAD_PRIORITY_NORMAL 线程的优先级比其所在的进程优先级相同
THREAD_PRIORITY_TIME_CRITICAL 如果线程包含在HIGH_PRIORITY_CLASS或更低的进程内,线程的基本优先级为15;如果线程包含在REALTIME_PRIORITY_CLASS进程内,其基本优先级为31

 在默认情况下,线程的优先级为THREAD_PRIORITY_NORMAL。

<三>Win32 API创建的线程类型

当调用CreateThread函数时,系统可以创建多种类型的线程,具体分为以下几种;

  1. 工作线程:最常见的就是创建工作线程,为了实现一定的功能而创建的线程
  2. 消息线程:它的实现方式与工作线程相似,只是消息线程本身包含一个消息队列,可以接受和处理消息。为了创建消息线程,需要调用API函数:GetMessage()和PostThreadMessage();这俩函数的具体用法请查看相应的API手册。
  3. 窗口线程:具有窗口的线程。因为窗口一般都具有接收消息的功能,因此窗口线程是由消息线程扩展得到的。/***注:窗口线程没怎么看懂****/
原文地址:https://www.cnblogs.com/LCCRNblog/p/3383047.html