Windows线程是可以执行的代码的实例。系统是以线程为单位调度程序。一个程序当中可以有多个线程,实现多任务的处理。
windows线程的特点:
1.线程都具有一个ID
2.每个线程都具有自己的内存栈;
3.同一进程中的线程使用同一个地址空间。
线程的调度:
操作系统将CPU的执行的时间划分成时间片,依次根据时间片执行不同的线程。
线程轮询:线程A->线程B->线程A->线程B->…
创建线程
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//安全属性,总是置零,因为已废弃
SIZE_T dwStackSize,//线程栈的大小(是以1M为单位对齐)
LPTHREAD_START_ROUTINE lpStartAddress,//线程处理函数的函数地址(程序员自己定义,由操作系统进行调用)
LPVOID lpParameter, //传递给线程处理函数的参数
DWORD dwCreationFlags,//线程的创建方式(1线程立即执行、2线程挂起<先休眠,再唤醒>)CREATE_SUSPENDED 线程挂起
LPDWORD lpThreadId //创建成功,返回线程的ID
); //创建成功,返回线程句柄
定义线程处理函数
DWORD WINAPI TreadProc(
LPVOID lpParameter //创建线程时,传递给线程的参数
);
实例如下:

#include <Windows.h>
#include <stdio.h>DWORD CALLBACK myThreadProc(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){Sleep(2000);printf("%s\n",szText);}
}
int main()
{char* szText = "***XXX***TTT";DWORD myThreadId = 0;HANDLE hThread = CreateThread(NULL,0,myThreadProc,szText,0,&myThreadId);system("pause");return 0;
}

线程挂起
DWORD SuspendThread(
HANDLE hThread //要挂起的线程
);
唤醒线程

DWORD ResumeThread(HANDLE hThread //要唤醒的线程
);
#include <Windows.h>
#include <stdio.h>DWORD CALLBACK myThreadProc1(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){Sleep(2000);printf("%s\n",szText);}
}
DWORD CALLBACK myThreadProc2(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){Sleep(2000);printf("%s\n",szText);}
}int main()
{char* szText1 = "***Thread1***";char* szText2 = "---Thread2---";DWORD myThreadId1 = 0;DWORD myThreadId2 = 0;HANDLE hThread1 = CreateThread(NULL,0,myThreadProc1,szText1,CREATE_SUSPENDED,&myThreadId1);HANDLE hThread2 = CreateThread(NULL,0,myThreadProc2,szText2,CREATE_SUSPENDED,&myThreadId2);ResumeThread(hThread1);ResumeThread(hThread2);printf("Thread1 alive ****\n");SuspendThread(hThread2);system("pause");printf("Thread2 alive ---\n");ResumeThread(hThread2);SuspendThread(hThread1);system("pause");printf("Thread1 alive ***\n");printf("Thread2 dead ---\n");ResumeThread(hThread1);SuspendThread(hThread2);system("pause");system("pause");return 0;
}

结束指定线程(杀别人线程<他杀>)
BOOL TerminateThread(
HANDLE hThread, //要结束的线程
DWORD dwExitCode //退出 码
);
结束函数所在的线程(线程自杀)
VOID ExitThread(
DWORD dwExitCode //退出代码
);
获取当前线程的ID
DWORD dThreadId = GetCurrentThreadId();
获取当前线程的句柄
HANDLE hThread = GetCurrentThread();

常用的等候线程函数
等候单个句柄有信号
VOID WaitForSingleObject(
HANDLE handle,//句柄buff的地址
DWORD dwMilliseconds //等候时间(最长等候时间,如果在最大等候时间都没有来信号,就直接返回)
//INFINITE 时间无线长,大于一万年!!!
); //等候有信号就返回,如果超时了就返回,如果设置INFINITE参数,那么就死等信号返回。
线程句柄是可以等候,有信号和无信号的句柄才能称之为可等候句柄
信号量句柄等
同时等候多个句柄有信号
DWORD WaitForMultipleObjects(
DWORD nCount,//句柄数量
CONST HANDLE *lpHandles,//句柄Buff的地址,多个句柄,是个数组
BOOL bWaitAll,//等候方式
DWORD dwMiliseconds //等候时间,可以设置无限长时间参数INFINITE
);
bWaitAll-等候方式
TRUE-表示所有句柄都有信号,才会结束等候
FALSE-表示句柄中只有1个有信号,就结束等候

线程句柄什么时候有信号什么时候无信号???
当线程处于执行时,线程句柄无信号
当线程结束的那一刻,线程句柄才会有信号

#include <Windows.h>
#include <stdio.h>DWORD CALLBACK myThreadProc1(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){Sleep(1000);printf("%s\n",szText);}
}
DWORD CALLBACK myThreadProc2(LPVOID lpParam)
{char* szText = (char*)lpParam;while(1){Sleep(500);printf("%s\n",szText);}
}int main()
{char* szText1 = "***Thread1***";char* szText2 = "---Thread2---";DWORD myThreadId1 = 0;DWORD myThreadId2 = 0;HANDLE hThread1 = CreateThread(NULL,0,myThreadProc1,szText1,0,&myThreadId1);WaitForSingleObject(hThread1,INFINITE);HANDLE hThread2 = CreateThread(NULL,0,myThreadProc2,szText2,0,&myThreadId2);ResumeThread(hThread1);ResumeThread(hThread2);printf("Thread1 alive ****\n");SuspendThread(hThread2);system("pause");printf("Thread2 alive ---\n");ResumeThread(hThread2);SuspendThread(hThread1);system("pause");printf("Thread1 alive ***\n");printf("Thread2 dead ---\n");ResumeThread(hThread1);SuspendThread(hThread2);system("pause");system("pause");return 0;
}

Windows线程CreateThread、线程处理函数、SuspendThread、ResumeThread、WaitForSingleObject、WaitForMultipleObjects相关推荐

  1. Win32系统编程 线程控制(Suspendthread ResumeThread WaiteForSingleObject WaitForMultipleObjects)

    前提摘要 前面几章已经提过线程的概念,这里直接介绍线程控制常用的代码简单明了 会介绍的函数 Suspendthread ResumeThread WaiteForSingleObject WaitFo ...

  2. windows线程挂起与唤醒,SuspendThread与ResumeThread的一些相关问题

    总结一下,创建进程有好多种方法, CreateThread:这个函数WIN32api函数,最好不要用这个函数,会造成一些错误(原因还是很深刻的) AfxBeginThread:这个方法是MFC特有的创 ...

  3. CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)

    0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...

  4. Windows API一日一练 50 SuspendThread和ResumeThread函数

    操作系统对线程有几种状态的变化:执行,挂起和恢复执行. 当线程做完任务或者现在想暂停线程运行,就需要使用SuspendThread来暂停线程的执行,当然恢复线程的执行就是使用ResumeThread函 ...

  5. Windows API一日一练(50)SuspendThread和ResumeThread函数

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 操作系统 ...

  6. c语言调用createthread线程的头文件_易语言API多线程总汇

    [thread] 即,线程,是进程中某一顺序的控制流,在单个程序中同时运行多个线程完成不同工作,称为多线程. 易语言多线程 理解:进程是一个可执行程序,由私有虚拟地址空间.代码.数据和其它操作系统资源 ...

  7. 笔记:windows环境下线程编程(C++实现同步与互斥)

    Windows系统为我们提供了相关API,我们可以使用他们来进行多线程编程. 1.创建一个线程,参数解释如下: HANDLE CreateThread(LPSECURITY_ATTRIBUTES lp ...

  8. Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写

    Windows进程与线程学习笔记(九)-- 线程优先级/进程挂靠/跨进程读写 要点回顾 线程优先级 调度链表 分析 KiFindReadyThread 分析 KiSwapThread 总结 进程挂靠 ...

  9. Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS

    Windows进程与线程学习笔记(八)-- 线程切换与TSS/FS 要点回顾 线程切换与TSS 内核堆栈 调用API进0环 实验:分析SwapContext 线程切换与FS 段描述符结构 分析Swap ...

最新文章

  1. make编译过程-Android10.0编译系统(三)
  2. 太白---落燕纷飞第一重 Android单元測试Instrumentation和irobotium
  3. python 两数之和
  4. golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法
  5. cpu是32位的 这指的是数据总线还是地址总线是32条?另外,电脑操作系统是3位的这指的是什么意思?指令是32...
  6. matlab2c使用c++实现matlab函数系列教程-weibpdf函数
  7. Android 一些笔记(这只是一些个人笔记)
  8. 统计挖掘那些事(六)——强大的逻辑回归(理论+案例)
  9. MyBatis学习笔记(一) 概述
  10. idea中刷新项目快捷键_IntelliJ Idea 常用快捷键列表
  11. matlab 声纹识别,识别模型论文,关于基于MATLAB的声纹识别系统软件的设计相关参考文献资料-免费论文范文...
  12. JavaScript 小白手册
  13. 加解密篇 - 非对称加密算法 (RSA、DSA、ECC、DH)
  14. linux中rcf命名管道,RCF-进程间为C通讯
  15. POE交换机应该要选择网线?POE交换机选择网线要点
  16. 左侧菜单栏左滑收起展开效果
  17. 将切割后的小图片还原为大图片
  18. nabc模型_团队开发-极速蜗牛-NABC模型
  19. Sunday算法---简单高效的字符串匹配算法
  20. 有关CreateCompatibleDC(pdc)的基本讲述

热门文章

  1. ARM 学习笔记之1: 必看的ARM 官方文档
  2. 2013年中国android智能手机用户调查研究报告,2013年中国IT网民手机使用时间调查报告...
  3. Android系统访问串口设备
  4. 西安交通大学XJTU计算机专硕912专业课复习经验分享
  5. 二极管、发光二极管参数详解
  6. 如何让div靠右_div里的元素分别靠左靠右居中如何实现
  7. 我为什么会放弃了大厂 45 万美元的高薪工作?
  8. Android: How to Capture Screen in Gingerbread(2.3中实现截屏)(续)
  9. @Transactional TransactionManager 源码分析
  10. php 会议预定系统