线程(1)

原创 2013年12月02日 17:35:59

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

        该函数的特点是它不但可以等待内核对象,还可以等消息。也就是当有消息到来时,该函数也一样可以返回,并处理消息,这样就给了工作线程退出的机会。


  














Google面试题—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:A:1 2 3 4 1 2....B:...
  • lilien1010
  • lilien1010
  • 2012年10月27日 19:56
  • 7598

多线程---有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD

有四个线程1、2、3、4。 线程1的功能就是输出1, 线程2的功能就是输出2,以此类推………现在有四个文件ABCD。 初始都为空。 现要让四个文件呈如下格式: A:1 2 3 4 1 2…....
  • havedream_one
  • havedream_one
  • 2015年07月05日 09:54
  • 2169

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推........

现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式: A:1 2 3 4 1 2.... B:2 3 4 1 2 3.... C:3 4 1 2 3 4.... D:4 1 2 3 ...
  • FunkyFrog821951259
  • FunkyFrog821951259
  • 2016年12月04日 20:20
  • 479

设计 4个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。写出程序

package encode; public class TestFourThread { private int j=0;//实现runable接口的线程可以共享变量,实现Runnabl...
  • u014236541
  • u014236541
  • 2016年04月18日 13:28
  • 5578

ORA-00312: 联机日志 1 线程

2007/12/18 09:50 A.M. Microsoft Windows XP [版本 5.1.26...
  • liyimingvip
  • liyimingvip
  • 2008年05月23日 12:21
  • 1785

Google面试题(java)—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD

转自:http://blog.csdn.net/b275518834/article/details/8750142 import java.util.ArrayList; import...
  • martin_liang
  • martin_liang
  • 2016年02月20日 22:59
  • 937

有四个线程1、2、3、4,线程1的功能就是输出1,线程2的功能就是输出2,以此类推......... 现在有四个文件A B C D,初始都为空。现要让四个文件呈如下格式:A:1 2 3 4 1 2..

具体题目如下: 有四个线程1、2、3、4, 线程1的功能就是输出1,线程2的功能就是输出2, 以此类推.........  现在有四个文件A B C D, 初始都为空。现要让四个文件呈如下格...
  • qq_27093465
  • qq_27093465
  • 2017年07月25日 14:20
  • 1447

执行完线程1再执行线程2 以及线程1和线程2共同执行

package test; public class SimpleThread extends Thread { String name; public SimpleThread(String ...
  • myloveprogrmming
  • myloveprogrmming
  • 2017年04月13日 22:01
  • 421

一道面试题 设计4个线程,其中两个每次对j增加1,另外两个对j每次减少1。循环100次。

题目 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。循环100次。写出程序。 解法1书上的答案是用内部类实现的,网上的答案基本都是照抄书上的。感觉不是很优雅,想自己实现以下...
  • never_cxb
  • never_cxb
  • 2015年12月22日 12:11
  • 2557

编写10个线程,第一个线程从1加到10,第二个线程从11加到20…第十个线程从91加到100, 最后再把10个线程结果相加。

编写10个线程,第一个线程从1加到10,第二个线程从11加到20…第十个线程从91加到100, 最后再把10个线程结果相加。...
  • qq_33343480
  • qq_33343480
  • 2016年08月25日 22:03
  • 3879
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程(1)
举报原因:
原因补充:

(最多只允许输入30个字)