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多线程的更多相关文章

  1. CPP-基础:windows api 多线程---互斥量、信号量、临界值、事件区别

    http://blog.csdn.net/wangsifu2009/article/details/6728155 四种进程或线程同步互斥的控制方法:1.临界区:通过对多线程的串行化来访问公共资源或一 ...

  2. 【转】Windows的多线程编程,C/C++

    在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread    使 ...

  3. 【转】windows平台多线程同步之Mutex的应用

    线程组成:  线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量.   操作系统为每一个运行线程安排一定的CPU时间 —— 时间片.系统通 ...

  4. c运行库、c标准库、windows API的区别和联系

    C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...

  5. Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)

    事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...

  6. windows lua 多线程 线程同步

    今天在改一个程序,改成部分逻辑用lua写,这个程序是多线程的.将程序中部分逻辑改成lua之后,各种非法访问内存错误,各种奇奇怪怪的问题,不分时间,不分地点的出现崩溃.从调用堆栈来看,基本都是使用lua ...

  7. (转)c运行库、c标准库、windows API的区别和联系

    C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...

  8. Windows API 进程相关笔记

    0. 前言 最近做了一个进程信息相关的项目,整理了一下自己做项目时的笔记,分享给大家 1. 相关概念 1.1 HANDLE 概念 HANDLE(句柄)是Windows操作系统中的一个概念. 在Wind ...

  9. C# Windows API

    API:应用程序接口(API:Application Program Interface)应用程序接口(API:application programming interface)是一组定义.程序及协 ...

随机推荐

  1. docker深入学习二

    dicker:数据管理 数据管理机制 docker使用union file system来管理数据,docker构建image和container也是采用了同样的技术. image层次 iamge由多 ...

  2. Java集合对比

    1.array和ArrayList 的区别?1.1:ArrayList是Array的复杂版本1.2:数组不能扩容集合可以扩容1.3:存储的数据类型:Array只能存储相同数据类型的数据,而ArrayL ...

  3. 为什么重写equals一定要重写hashCode方法?

    大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...

  4. ubuntu 16.04 循环登陆问题

    换了个titan x重装显卡驱动失败之后一直循环登陆,试了N种处理显卡驱动的方法,并没有啥用. 最后查看了一下.Xerrer文件(具体的文件名我给忘记了),发现是.Xauthority. 现象:在Ub ...

  5. commonjs 与 es6相关Module语法的区别

    1.export 在接口名字与模块内部的变量之间建立了一一对应的关系,export输出的接口,与其模块内对应的变量值是动态绑定的,即通过暴露的接口可以取到模块内与之对应绑定变量的实时的值. commo ...

  6. 设置 SQL*Plus 的运行环境

    SQL*Plus 的运行环境是用来输入.执行 SQL*Plus 命令和显示返回结果的场所,设置合适的 SQL*Plus 运行环境,可以使 SQL*Plus 按照用户的要求运行和执行各种操作.set 命 ...

  7. ceph luminous版部署bluestore

    简介 与filestore最大的不同是,bluestore可以直接读写磁盘,即对象数据是直接存放在裸设备上的,这样解决了一直被抱怨的数据双份写的问题 Bluestore直接使用一个原始分区来存放cep ...

  8. centos7.5 配置sftp

    1.创建sftp组 groupadd sftp 2.sftp组的用户的home目录统一指定到/u01/sftp下 mkdir -p /u01/sftp/ 3.创建一个sftp用户,用户名为devsft ...

  9. 运维开发笔记整理-django日志配置

    运维开发笔记整理-django日志配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Django日志 Django使用python内建的logging模块打印日志,Pytho ...

  10. Java抽象语法树AST,JCTree 分析

    JCTree简要分析文章目录JCTree简要分析JCAnnotatedTypeJCAnnotationJCArrayAccessJCArrayTypeTreeJCAssertJCAssignJCAss ...