线程总结(1)

1 进程和线程的区别
  进程: 进程是由两个部分构成的,一个是进程内核对象,另一个是地址空间
  线程:
    一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
    另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量

2 标准 线程函数
  DWORD WINAPI ThreadFunc(PVOID pvParam)
{
  DWORD dwResult = 0;
  ...
  return(dwResult); // 线程终止运行,该堆栈的内存被释放, 同时,线程的内核对象的使用计数被递减。如果使用计数降为0,线程的内核对象就被撤消
}

 创建线程API
 HANDLE CreateThread(
   PSECURITY_ATTRIBUTES psa,
   DWORD cbStack,
   PTHREAD_START_ROUTINE pfnStartAddr,
   PVOID pvParam,
   DWORD fdwCreate,
   PDWORD pdwThreadID);
当CreateThread被调用时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。这与进程和进程内核对象之间的关系是相同的。
 
3  终止线程的运行
  1 线程函数返回
      在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消。

     • 操作系统将正确地释放线程堆栈使用的内存。

     • 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。

     • 系统将递减线程内核对象的使用计数。

  2 ExitThread
     该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C + +资源(如C + +类对象(析构函数))将不被撤消。

  3 TerminateThread
    与ExitThread不同,ExitThread总是撤消调用的线程,而TerminateThread能够撤消任何线程, h T h r e a d参数用于标识被终止运行的线程的句柄。当线程终止运行时,它的退出代码成为你作为d w E x i t C o d e参数传递的值。同时,线程的内核对象的使用计数也被递减。
  注意Te r m i n a t e T h r e a d函数是异步运行的函数,也就是说,它告诉系统你想要线程终止运行,但是,当函数返回时,不能保证线程被撤消。如果需要确切地知道该线程已经终止运行,必须调用Wa i t F o r S i n g l e O b j e c t ()或者类似的函数,传递线程的句柄。
  当使用返回或调用E x i t T h r e a d的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用Te r m i n a t e T h r e a d,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。M i c r o s o f t故意用这种方法来实现Te r m i n a t e T h r e a d。如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值,那么其他的线程就会出现访问违规的问题。如果将已经撤消的线程的堆栈留在内存中,那么其他线程就可以继续很好地运行。
 
 4 判断线程是否运行
   GetExitCodeThread

 5 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器
 

原文地址:https://www.cnblogs.com/chengxin1982/p/1623473.html