美文网首页从汇编到C++
线程的创建和控制

线程的创建和控制

作者: Asura_Luo | 来源:发表于2018-05-04 02:36 被阅读0次

线程的创建和控制

进程和线程的关系:进程提供资源,线程使用资源完成工作

创建线程函数

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性 
  DWORD dwStackSize,                        // initial stack size //线程栈大小-
  LPTHREAD_START_ROUTINE lpStartAddress,    // thread function //线程代码
  LPVOID lpParameter,                       // thread argument //线程参数
  DWORD dwCreationFlags,                    // creation option //创建标识
  LPDWORD lpThreadId                        // thread identifier //线程id
);

线程的控制

//线程等待
//等待一个
DWORD WaitForSingleObject(  
    HANDLE hHandle,        // handle to object,监视对象的句柄
    DWORD dwMilliseconds   // time-out interval 指定超时等待时间 毫秒为单位
);
//等待多个
DWORD WaitForMultipleObjects(
  DWORD nCount,             // number of handles in array,句柄数量
  CONST HANDLE *lpHandles,  // object-handle array 句柄数组
  BOOL fWaitAll,            // wait option 是否全等待/TRUE 全部结束才返回/False 一个结束就返回
  DWORD dwMilliseconds      // time-out interval,超时时间
);
//获取线程的退出代码
BOOL GetExitCodeThread(  
    HANDLE hThread,      // handle to the thread
    LPDWORD lpExitCode   // termination status
);

更多的API

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性 
  DWORD dwStackSize,                        // initial stack size //线程栈大小-
  LPTHREAD_START_ROUTINE lpStartAddress,    // thread function //线程代码
  LPVOID lpParameter,                       // thread argument //线程参数
  DWORD dwCreationFlags,                    // creation option //创建标识
  LPDWORD lpThreadId                        // thread identifier //线程id
);

创建标志位:
指定一个标志来控制线程的创建,如果指定了 CREATE_SUSPENDED标志,则线程是在一个挂起状态下创建的,并且在调用了ResumeThread ()函数之前不会运行,如果这个值为零,那么线程在创建之后立即运行

//线程回复
DWORD ResumeThread(  
    HANDLE hThread   // handle to thread 目标线程的句柄
);

//让自己停下来
VOID Sleep(  
    DWORD dwMilliseconds   // sleep time 暂停时间
);

//让目标停下来

DWORD SuspendThread(  
    HANDLE hThread   // handle to thread 挂起目标的句柄
);

挂起计数:

API ResumeThread 提到了挂起计数

线程在系统中通过线程内核对象管理,线程内核对象有一个 挂起计数器
用于统计当前线程被挂起的次数
当调用SuspendThread 挂起计数就会+1
调用ResumeThread 挂起计数就会-1

当挂起计数为0时,线程将会正常执行

线程的本质

  • 一个单核CPU 一瞬间只能做一件事,那如何实现多线程在一个进程内“同时”干不同的工作

    操作系统会给每一个线程都分配一定的时间,在一点时间内CPU加载对应的线程上下文执行线程对应代码和EIP所指向的位置、堆栈等,时间过后就保存当前执行的环境,然后更换线程上下文,来回调度。对于CPU来说 一瞬间就做了一件事,但是CPU速度非常快。在我们看起来就是一起做很多事情

  • 什么是线程?

    一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成

    线程是WINDOWS中最基本的调度单位

    线程调度
    理论上A、B、C、D 进程 轮流调度执行
    但是实际上 windows系统是以线程为单位轮流调度执行的。原因很复杂,有一套复杂的逻辑
    根据一些条件灵活调度,比如线程优先级、饥饿度等

![image](https://img.haomeiwen.com/i5396392/c4181319ab8be6d0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 获取线程的上下文CONTEXT结构体

    BOOL GetThreadContext(  
        HANDLE hThread,       // handle to thread with context 目标线程句柄
        LPCONTEXT lpContext   // context structure 结构体缓存
     );
    
image

练习:

通过创建快照CreateToolhelp32Snapshot的方式,遍历所有线程
每个进程有一个PID,线程也有TID,找到目标进程中所有线程,然后全部挂起。实现一个线程挂起功能

相关文章

  • 线程的创建和控制

    线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作 创建线程函数 线程的控制 更多的API 创...

  • 线程池的使用以及实现原理

    线程池优点 限流控制线程总数,根据硬件人为控制使性能达到最优 复用减少线程的频繁创建和销毁复用线程 效率因为线程可...

  • 多线程 ---- NSThread和线程安全

    创建和启动线程 一个NSThread对象就代表一条线程 主线程相关方法 其他方法 获得当前线程 线程的名字 其他创...

  • 【多线程】NSThread

    1️⃣创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建、启动线程 主线程相关用法 其他用法 创...

  • OC-多线程-NSThread

    创建和启动线程一个NSThread对象就代表一条线程创建、启动线程 主线程相关用法 获得当前线程 线程的名字 控制...

  • Android中的线程池 ThreadPoolExecutor

    线程池的优点: 重用线程池中的线程,避免因为线程的创建和销毁带来的性能消耗 能有效的控制线程的最大并发数,避免大量...

  • Android线程池的开发精要

    使用线程池的好处 可以归纳为3点: 重用线程池中的线程, 避免因为线程的创建和销毁所带来的性能开销. 有效控制线程...

  • 对线程池的理解和原理简记

    线程池简介 线程池的优点 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销 能有效控制线程池的最大并发...

  • 全方位解析-Android中的线程池

    笔记文章,没有废话,句句关键 线程池的优点 重用线程池里的线程,避免创建和销毁线程所带来的性能开销 有效控制最大并...

  • Android中的线程池

    线程池的好处 (1)重用线程池中的线程,避免因为线程的创建和销毁所带来的性能的开销。(2)能有效控制线程池的最大并...

网友评论

    本文标题:线程的创建和控制

    本文链接:https://www.haomeiwen.com/subject/ugyrrftx.html