zoukankan      html  css  js  c++  java
  • 浅尝《Windows核心编程》之线程创建、退出、暂停、恢复

    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)
    {
       
    //to do what you want;
       
    // ..
       return 0;//the only correct and safe way to exit thread
    }


    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。 

  • 相关阅读:
    Eclipse和MyEclipse使用技巧--Eclipse各版本介绍
    专业分类
    Eclipse如何安装JD-Eclipse反编译插件
    JS生成UUID的方法实例
    第一章 Spring Security是什么?
    证件类型及编码含义
    银行机构代码
    html页面通过特殊链接:打电话,发短信,发邮件详细教程
    Eclipse修改Tomcat发布路径以及的配置多个Tomcat方法
    jquery实践案例--验证电子邮箱
  • 原文地址:https://www.cnblogs.com/aicro/p/1497362.html
Copyright © 2011-2022 走看看