线程(1)
来源:互联网 发布:syntaxhighlighter.js 编辑:程序博客网 时间:2024/05/21 19:44
CreateThread()
函数的lpThreadId带回来的是线程ID,线程ID是一个全局变量,可以独一无二地表示系统中任一进程中的某个线程。AttachThreadInput和PostThreadMessage就需要用到线程ID,这两个函数允许你影响到其他人(线程)的消息队列。
CreateThread传回来的handle被称为一个核心对象(kernel object)。核心对象和所谓的GDI对象,如画笔、画刷或DC差不多,只不过它由KERNEL32.DLL管理,而非GDI32.DLL管理。【核心对象和用户对象】
核心对象清单:
进程(process) , 线程(thread) , 文件(file) ,事件(event) ,信号量(semaphore) , 互斥器(mutex), 管道(pipe,分为named和anonymous)。
GDI对象和核心对象之间的区别:GDI对象有单一的拥有者,不是进程就是线程。核心对象可以有一个以上的拥有者,可以是跨进程的。使用一个引用计数保持对每一个拥有者的追踪,当引用计数降至0,这一核心对象即自动销毁。
线程其他函数:
GetExitCodeThread()获取线程的退出代码。
ExitThread():强制结束线程的运行。
程序启动后就执行的那个线程被称为主线程,主线程有两个特点,第一,它必须负责GUI程序中的主消息循环;第二,这一线程的结束(不论是因为返回或因为调用了ExitThread会使得程序中的所有线程都被强制的结束,其他线程没有机会做清理工作。
Win32说明文件一再强调线程分为GUI线程和Worker线程两种,GUI线程负责建造窗口以及处理主消息循环。Worker线程负责纯粹的运算工作。一般而言,GUI线程绝不会去做那些不能够马上完成的工作。
GUI线程的定义是:拥有消息队列的线程。任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理,所有对此窗口的改变也都应该由该线程完成。
如果worker线程也产生一个窗口,那么就会有一个消息队列随之被产生出来并附着到此线程身上,于是worker线程会摇身一变成为GUI线程。这里的意思是,Worker线程不能够产生窗口、对话框、消息框、或其他任务与UI有关的东西。
如果一个worker线程需要输入或输出错误信息,它应该授权给UI线程来做,并将结果通知给worker线程。
GetTickCount():返回的是系统从启动到现在进过的毫秒数。
等待线程结束:
1,通过Sleep()函数,这个函数要求操作系统终止线程动作,直到渡过某个指定时间之后才恢复。
2,使用busy loop,通过主线程不断调用GetExitCodeThread(),直到其结果不再是STILL_ACTIVE,但时间效率太低。
3,waitforsingleObject():它能够在某个线程结束时(而不是某段时间结束时)被调用,由于让线程停工是操作系统的责任,很合理地我们会认为操作系统也有责任让其他线程知道某个线程停工了。该函数会让执行该函数的线程等待,知道等待的核心对象被标识为激发状态或者等待的时间结束。如果超时时间为0,使你能够检查handle的装备并立即返回,没有片刻停留,如果handle已经备妥,那么这个函数会成功并传回WAIT_OBJECT_0,否则,这个函数立即返回并传回WAIT_TIMEOUT。
可被WaitForSingleObject()使用的核心对象有两种状态:激发与未激发,WaitForSingleObject会在目标物变成激发状态时返回。
当线程正在执行,线程对象处于未激发状态,当线程结束时,线程对象被激发了。因此,任何线程如果等待的是一个线程对象,将会在等待对象结束时被调用,因为当时线程对象自动变成激发状态。
Mutex:如果mutex没有被任何线程拥有,它就是出于激发状态,一旦一个等待的mutex的函数返回了,mutex就被自动重置为未激发状态。Semaphore和mutex类似,但它有个计数器,可以约束拥有者(线程)的个数。
MsgWaitForMultipleObjects
该函数的特点是它不但可以等待内核对象,还可以等消息。也就是当有消息到来时,该函数也一样可以返回,并处理消息,这样就给了工作线程退出的机会。
- Java线程模型、线程状态 - 线程(1)
- 线程1
- 线程1
- 线程(1)
- 线程1
- 线程1
- 线程(1)
- 线程1
- 线程1
- 线程1
- 线程(1)
- 线程1
- 线程(1)----线程停止
- Linux 线程(1):线程概述
- java 线程1 线程分类
- 【线程】Java线程(1)-线程基本理解and实现方式
- Linux线程(1): 线程的创建
- 线程(一)线程基础(1)
- GNU C标准中,struct 空数组成员妙用,构建动态数组
- 摘自-软件工程师berlin
- android webkit CSS3及Render初窥
- 原生JS操作网页给p元素添加onclick事件及表格隔行变色
- ios cell 样式
- 线程(1)
- SQL SERVER中GO的用法
- CString截取字符串全攻略
- java与freemarker中map的遍历
- 设计模式简介
- 查询优化时需要用到的SQL语句
- compute
- Paypal开源nodejs框架研究(一)KrakenJs
- EntityFramework在不同数据库下的配置