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。 

  • 相关阅读:
    C:大数相加
    杭电2186:悼念512汶川大地震遇难同胞——一定要记住我爱你
    实验五
    安装vmtools
    ubuntu20.04换源
    实验一 灯程序——OK6410A开发板LINUX3.0.1(嵌入式开发)
    OK6410A开发板LINUX3.0.1配置(嵌入式开发)
    实验四 Makefile
    虚拟机联网
    实验三 按键灯
  • 原文地址:https://www.cnblogs.com/aicro/p/1497362.html
Copyright © 2011-2022 走看看