浅尝《Windows核心编程》之线程创建、退出、暂停、恢复
2009-06-05 23:54
330 查看
1.线程的创建
线程的创建有多种方式,不过例如CreateThread之类的API不宜使用,因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。所以“绝对不要调用系统自带的CreateThread函数创建新的线程,而应该使用_beginthreadex,除非你在线程中绝不使用需要tiddata结构的运行时库函数”。
对于这句话,便友峰峰的理解是“需要用到Thread Local Storage的时候用CreateThread,不用的时候用_beginthreadex”。这个还有待考证。
(有位大哥为我们指点了迷津,具体的说法请见http://www.cnblogs.com/lgxqf/archive/2009/02/10/1387480.html)
具体实例如下:
#include "windows.h"
unsigned __stdcall ThreadProc(void * p)
HANDLE h1 = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,NULL,NULL);
2.线程的退出
可以使用以下几种方法退出,不过只推荐第一种方法。
(1)线程函数返回。(能正常退出,而且通常不会出现资源泄漏)
有一个利用等待和事件内核对象做到的多线程实例,请参看《浅尝<Windows核心编程>之线程退出实例》
(2)ExitThread函数。
这个方法不能够在退出的时候释放c++资源(如c++类对象),不推荐是哦那个。
(3)TerminateThread函数。
不同于ExitThread,它能够退出任何的线程(只要能够拿到线程句柄)。
(4)包含线程的进程终止运行。
3.线程的暂停
可以使用 SuspendedThread 函数来暂停线程。
不过通常不建议这样做,因为这样不是很安全,因为你不知道目前被suspend的那个线程跑到了什么程度,比如说如果它正好在访问某段内存,由于访问的互斥,它会将这段内存上锁,如果这个时候就suspend它,那么将无法再使用这段内存(写)。
4.线程的恢复
恢复线程,就是使它成为可调度的线程,可以使用 ResumeThread 函数。如果成功将会返回前一个暂停计数。
注意,如果一个线程暂停了3次,那么它必须恢复3次,然后它才能够可以被分配给一个CPU。
线程的创建有多种方式,不过例如CreateThread之类的API不宜使用,因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。所以“绝对不要调用系统自带的CreateThread函数创建新的线程,而应该使用_beginthreadex,除非你在线程中绝不使用需要tiddata结构的运行时库函数”。
对于这句话,便友峰峰的理解是“需要用到Thread Local Storage的时候用CreateThread,不用的时候用_beginthreadex”。这个还有待考证。
(有位大哥为我们指点了迷津,具体的说法请见http://www.cnblogs.com/lgxqf/archive/2009/02/10/1387480.html)
具体实例如下:
#include "windows.h"
unsigned __stdcall ThreadProc(void * p)
HANDLE h1 = (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,NULL,NULL);
2.线程的退出
可以使用以下几种方法退出,不过只推荐第一种方法。
(1)线程函数返回。(能正常退出,而且通常不会出现资源泄漏)
有一个利用等待和事件内核对象做到的多线程实例,请参看《浅尝<Windows核心编程>之线程退出实例》
(2)ExitThread函数。
这个方法不能够在退出的时候释放c++资源(如c++类对象),不推荐是哦那个。
(3)TerminateThread函数。
不同于ExitThread,它能够退出任何的线程(只要能够拿到线程句柄)。
(4)包含线程的进程终止运行。
3.线程的暂停
可以使用 SuspendedThread 函数来暂停线程。
不过通常不建议这样做,因为这样不是很安全,因为你不知道目前被suspend的那个线程跑到了什么程度,比如说如果它正好在访问某段内存,由于访问的互斥,它会将这段内存上锁,如果这个时候就suspend它,那么将无法再使用这段内存(写)。
4.线程的恢复
恢复线程,就是使它成为可调度的线程,可以使用 ResumeThread 函数。如果成功将会返回前一个暂停计数。
注意,如果一个线程暂停了3次,那么它必须恢复3次,然后它才能够可以被分配给一个CPU。
相关文章推荐
- python-线程的暂停, 恢复, 退出
- python 线程的暂停, 恢复, 退出详解及实例
- linux线程创建、挂起、恢复、退出
- python 线程的暂停, 恢复, 退出详解及实例
- pthread_create主线程与创建的新线程之间退出关系
- linux中线程的挂起与恢复(进程暂停)
- 【Linux学习】pthread_create主线程与创建的新线程之间退出关系
- iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信
- 线程的创建与退出
- 线程暂停与恢复研究
- 正确创建和退出线程,防止内存泄漏
- python 多线程2-线程的创建启动,退出
- linux多线程学习(二)——线程的创建和退出
- C# 线程的暂停与恢复
- 《Windows核心编程》学习笔记(6)– 线程的创建、与进程的关系、伪句柄转换
- 猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止
- Window API (七)多线程的创建、退出、传递线程信息
- java线程(暂停、恢复、结束)前引
- pthread线程的终止退出 | 线程的大量创建
- windows笔记-线程的暂停和恢复