windows api多线程
windows api多线程
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
以上来自百度百科。多线程技术会让程序变得更加强大,是单线程永远无法实现的。例如,在命令行中,用户正在响应getchar函数,而我需要在用户输入的同时将命令行标题改为现在的时间,这个效果是单线程永远不可能达到的。学习了本教程的内容,上面的例子就不难做到。
首先,认识API函数CreateThread:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
参数及其复杂,但事实上在普通的编程中大多数参数基本不需要用到。直接看示例代码:
void Thread1()
{
while(1)
{
system("title %time%");
}
}
void main(int argc, char* argv[])
{
HANDLE hThread;
DWORD ThreadID;
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ThreadID);
getchar();
}
(如果提示getchar未定义,请加入stdio.h头文件)
是否实现了我们例子中想要的效果?让我们来分析一下代码。
首先,在main函数中使用API函数CreateThread创建了一个线程,线程的内容就是执行Thread1函数(参数三),然后就到了getchar函数中等待用户的输入完成。而在此同时,刚刚创建的线程正在执行Thread1函数的内容,就是不断地将命令行标题设置为当前时间。于是,我们的效果便达成了。
CreateThread返回的是线程的HANDLE,示例代码中是保存在hThread变量中。CreateThread会将第五个参数设置为线程的ID。线程的HANDLE和ID都是很重要的参数,对以后线程的其他操作有很重要的意义。
-----------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------------------
CreateThread参数说明:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // [in,可选] 句柄是否可被继承 ,为NULL则不可被继承
DWORD dwStackSize, //堆栈的初始大小,如为0系统自动分配
LPTHREAD_START_ROUTINE lpStartAddress, //指向由线程执行的应用程序定义函数的指针。
LPVOID lpParameter, //指向要传递给线程的变量的指针。
DWORD dwCreationFlags, //控制线程创建的标志。为0该线程在创建后立即运行;其它可选标志看下文.
LPDWORD lpThreadId //指向接收线程标识符的变量的指针。如果此参数为 NULL,则不返回线程标识符。
);
DWORD dwCreationFlags //可选标志
- 0 该线程在创建后立即运行。
- CREATE_SUSPENDED(0x00000004) 该线程在挂起状态下创建,并且不会运行,直到 ResumeThread函数被调用。
- STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000) 在所述dwStackSize参数指定堆栈的初始保留大小。如果未指定此标志,则dwStackSize指定提交大小。
-----------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------------------
那么,再介绍几个API函数,这几个函数比较简单,请读者们自由测试:
DWORD SuspendThread(
HANDLE hThread
);
这个是挂起线程的API函数,用于暂停线程的执行。参数为创建线程时返回的线程HANDLE。
DWORD ResumeThread(
HANDLE hThread
);
这个是继续执行线程的API函数,用于将已经挂起的线程恢复执行,与SuspendThread对应。参数为创建线程时返回的线程HANDLE。
VOID ExitThread(
DWORD dwExitCode
);
这个是停止(销毁)线程的API函数,只能在线程内部使用。参数为退出码,一般可设为0。
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);
这个是强行停止(销毁)线程的API函数,能在程序的任意部分使用。但是使用这一API函数来终止线程是不安全的,可能造成程序不稳定。不推荐使用。参数一为创建线程时返回的线程HANDLE,参数二为退出码,一般可设为0。
windows api多线程的更多相关文章
- CPP-基础:windows api 多线程---互斥量、信号量、临界值、事件区别
http://blog.csdn.net/wangsifu2009/article/details/6728155 四种进程或线程同步互斥的控制方法:1.临界区:通过对多线程的串行化来访问公共资源或一 ...
- 【转】Windows的多线程编程,C/C++
在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread 使 ...
- 【转】windows平台多线程同步之Mutex的应用
线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量. 操作系统为每一个运行线程安排一定的CPU时间 —— 时间片.系统通 ...
- c运行库、c标准库、windows API的区别和联系
C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...
- Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...
- windows lua 多线程 线程同步
今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的.将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃.从调用堆栈来看,基本都是使用lua ...
- (转)c运行库、c标准库、windows API的区别和联系
C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...
- Windows API 进程相关笔记
0. 前言 最近做了一个进程信息相关的项目,整理了一下自己做项目时的笔记,分享给大家 1. 相关概念 1.1 HANDLE 概念 HANDLE(句柄)是Windows操作系统中的一个概念. 在Wind ...
- C# Windows API
API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...
随机推荐
- Ubuntu 18.04下安装Steam顶级在线游戏平台
Ubuntu 18.04下安装Steam顶级在线游戏平台 原创: 聆听世界的鱼 Linux公社 今天 Steam是由Valve公司开发的顶级在线游戏平台,是目前全球最大的综合性数字发行平台之一.它让你 ...
- shell 学习笔记9-while/until循环语句
一.while循环语句 1.循环语句 循环愈久就是重复执行一条指令或一组执行,知道条件不在满足时停止,shell循环语句包括,while.until.for.select语句 2.while循环 主要 ...
- Jupyter交互式工具安装使用
Jupyter交互式工具安装使用 Jupyter Notebook(此前被称为IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. 文档:https://jupyter ...
- Spring Cloud Alibaba学习笔记(21) - Spring Cloud Gateway 自定义全局过滤器
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的全局过滤器,本文介绍如何自定义全局过滤器. 自定义全局过滤需要实现GlobalFilter 接口,该接口和 GatewayFi ...
- RabbitMQ实战-死信队列
RabbitMQ死信队列 场景说明 代码实现 简单的Util 生产者 消费者 场景说明 场景: 当队列的消息未正常被消费时,如何解决? 消息被拒绝并且不再重新投递 消息超过有效期 队列超载 方案: 未 ...
- react基础学习和react服务端渲染框架next.js踩坑
说明 React作为Facebook 内部开发 Instagram 的项目中,是一个用来构建用户界面的优秀 JS 库,于 2013 年 5 月开源.作为前端的三大框架之一,React的应用可以说是非常 ...
- 笔谈OpenGL ES(三)
昨天下午以及今天一天,公司安排了新员工培训课程,占用了自己的一些时间,但是也了解到一些新的有利于自身的东西.进公司就要进有完善公司体系和制度的公司,小公司真的是没搞头的,我体验过,反正小公司以后是不会 ...
- IDRAC 固件升级操:
Internal Use - Confidential IDRAC 固件升级操作: R630:https://downloads.dell.com/FOLDER05590166M/1/iDRAC-wi ...
- k83 svc
一,deployment Deployment为Pod和Replica Set下一代Replication Controller)提供声明式更新 1,配置示例 apiVersion: apps/v1 ...
- Linux下安装zookeeper和启动
原文:https://yq.aliyun.com/articles/662422 1.zookeeper官网下载安装包http://mirrors.hust.edu.cn/apache/zookeep ...