zoukankan      html  css  js  c++  java
  • Windows内核之线程简单介绍

    1 线程定义

    <1> 内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方

    <2>还有一个是线程堆栈。它用于维护线程在运行代码时须要的全部函数參数和局部变量.

    2 线程和进程的差别

    <1>进程是不活泼的。

    进程从来不运行不论什么东西。它仅仅是线程的容器。

    <2>线程在它的进程地址空间中运行代码,而且在进程的地址空间中对数据进行操作。

    <3>线程共享进程的地址控件

    <4>线程仅仅有一个内核对象和一个堆栈,保留的记录非常少,开销比进程少非常多。

    3 线程函数

    线程分为主线程以及一般线程。主线程的入口点函数必须是main。wmain,WinMain。wWinMain。一般线程函数则能够随便命名。而且必需要有一个函数返回值。

    4 创建线程

    HANDLE CreateThread( 
      LPSECURITY_ATTRIBUTES   lpThreadAttributes,       // SD
     SIZE_T         dwStackSize,                       // initial stack size
     LPTHREAD_START_ROUTINE      lpStartAddress,    // thread function
     LPVOID         lpParameter,            // thread argument
     DWORD      dwCreationFlags,         // creation option
      LPDWORD   lpThreadId              // thread identifier);

    <1>lpThreadAttributes

    指向一个SECURITY_ATTRIBUTES的指针。指定安全属性,当为NULL的时候,会利用系统默认的安全属性

    <2> dwStackSize

    设置线程栈的初始大小,以字节为单位,系统会把它四舍五入到页面大小的近期值,当设置为NULL 的时候,会採取系统的默认值。

    <3> lpParameter

    指向应用程序定义的LPTHREAD_START_ROUTINE类型的函数的指针。这个函数将有新线程运行,表示线程的新的起始地址。指定一个函数做位新线程的入口地址,函数的名称随意,可是类型必须依照以下的格式:

    DWROD   WINAPI    ThreadProc(LPVOID lpParameter);

    <4> lpParameter

    传递给线程的參数

    <5> dwCreationFlags

    设置用于线程创建的附加标记。是CREATE_SUSPENDED或者0两者之中的一个,假设是CREATE_SUSPENDED表示线程不马上运行。知道ResumeThread函数開始运行。

    <6> lpThreadId

    这是一个返回值,用于表示函数的线程ID。

    系统给线程分配的堆栈是从进程的地址空间中分配的,全部线程共享进程地址空间。他们之间通信非常方便。

    注意:CreateThread是Windows函数,假设要编写C/C++的多线程函数,那么就须要使用_beginTreadx函数

    5 线程的终止执行

    <1>线程函数的返回

    <2>通过ExitThread函数撤销线程,只是最好不用

    <3>同一个进程或者还有一个进程中的线程调用TerminateThread函数,应该避免用

    <4>包括线程的进程的终止执行,应该避免用

    5.1 线程函数返回时做的事情

    <1>在线程函数中创建的全部C + +对象均将通过它们的撤消函数正确地撤消

    <2>操作系统将正确地释放线程堆栈使用的内存

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

    <4>系统将递减线程内核对象的使用计数

    5.2 ExitThread 函数

    它可以使操作系统清除全部的操作系统资源,包含线程的堆栈,可是C++资源将不会被撤销

    5.3 TerminateThread 函数

    这个函数可以停止不论什么线程,可是它不会发送不论什么通知消息给将要撤销的线程。而且它是异步的。不能保证函数返回的时候,函数线程已经被终止。

    在进程终止前,线程的堆栈是不会被清除的,这样方便其它线程使用。

    5.4 进程终止时线程的终止

    相同的问题是进程强制终止,会造成

    5.5 线程终止时候发生的事情

    <1>线程的退出代码从S T I L L _ A C T I V E改为传递给E x i t T h r e a d或Te r m i n a t e T h r e a d的代码

    <2>线程内核对象的状态变为已通知

    <3>假设线程是进程中最后一个活动线程。系统也将进程视为已经终止执行

    <4>线程内核对象的使用计数递减1

    注意:通过检查线程句柄的推出去代码能够检查线程是否已经终止。

    响应的函数是:

    BOOL GetExitCodeThread(HANDLE hThread,LPDWORD lpDword)

  • 相关阅读:
    Java实现查找二叉树&C++的做法
    bootstrap搜索栏
    动态样式语言less初识
    动态改变伪元素样式的方(用:after和:before生成的元素)
    利用javascript动态加载头部出现点击事件与hover事件无效解决方法
    bootstrap的下拉菜单组件与导航条
    bootstrap的表单form
    php中mysqli_error($conn)的用法
    ajax的jQuery的表单序列化获取参数serialize()
    bootstrap基础样式学习(二)——栅格
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6751604.html
Copyright © 2011-2022 走看看