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)
具体实例如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2.线程的退出
可以使用以下几种方法退出,不过只推荐第一种方法。
(1)线程函数返回。(能正常退出,而且通常不会出现资源泄漏)
有一个利用等待和事件内核对象做到的多线程实例,请参看《浅尝<Windows核心编程>之线程退出实例》
(2)ExitThread函数。
这个方法不能够在退出的时候释放c++资源(如c++类对象),不推荐是哦那个。
(3)TerminateThread函数。
不同于ExitThread,它能够退出任何的线程(只要能够拿到线程句柄)。
(4)包含线程的进程终止运行。
3.线程的暂停
可以使用 SuspendedThread 函数来暂停线程。
不过通常不建议这样做,因为这样不是很安全,因为你不知道目前被suspend的那个线程跑到了什么程度,比如说如果它正好在访问某段内存,由于访问的互斥,它会将这段内存上锁,如果这个时候就suspend它,那么将无法再使用这段内存(写)。
4.线程的恢复
恢复线程,就是使它成为可调度的线程,可以使用 ResumeThread 函数。如果成功将会返回前一个暂停计数。
注意,如果一个线程暂停了3次,那么它必须恢复3次,然后它才能够可以被分配给一个CPU。