摘要:
两个等待函数 一个单线程,一个多线程。等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。(FangSH注:如果内核对象没有变为通知即线程永远等待下去。)这些等待函数中最常用的是WaitForSingleObject :[代码]第一个参数hObject标识一个能够支持被通知/未通知的内核对象(前面列出的任何一种对象都适用)。(FangSH注:句柄)第二个参数dwMilliseconds指明等待对象变为已通知状态所需的等待时间。(时间间隔以毫秒为单位,INFINITE表示直到等到hHandle为已通知状态)。传递INFINITE有些危险。如果对象永远不变为已通知状态,那么 阅读全文
摘要:
[代码]说明 :1 用法:用类定义一个对象, 然后调用函数。 如下:CritSect sect;Lock lock(sect);或CLock t;CSCopedLocker st(&t);2 但是,感觉这两种方法用的时候不是最安全的。具体的可以看一下《Effective C++》里面的条款13: 以对象管理资源。里面讲更好些。FangSH15:44 2011-1-5 阅读全文
摘要:
可以从例子学习,更好的掌握[代码]应该注意的:1 关键代码段(临界区)工作在用 用户方式下2 关键代码段(临界区)是指一个小代码段,在代码够执行前。它必须独占对某些资源的访问权。3 关键代码段是工作在用户方式下。同步速度较快,但在使用关键代码段时,很容易进入死锁状态。因为在等待进入关键代码段时无法设定超时值。4 线程死锁线程1拥有了临界区对象A。等待临界区对象B的拥有权。线程2拥有了临界区对象B,等待临界区对象A的拥有权,就造成了死锁。5 无法用它们对多个进程中的各个线程进行同步以下的例子就是进入了死锁。[代码] 阅读全文
摘要:
线程需要在下面两种情况下互相进行通信:•当有多个线程访问共享资源而不使资源被破坏时。•当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。所谓原子访问,是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。以InterLocked开始的函数都是户数函数。使用互锁函数的优点是:他的速度要比其他的CriticalSection,Mutex,Event,Semaphore快很多。调用一个互锁函数通常会导致执行几个CPU周期(通常小于50),并且不会从用户方式转换为内核方式(通常这需要执行1000个CPU周期)。可以查看msdn(http://msdn2.microsof 阅读全文
摘要:
线程运行时,常常想要调用windows函数来改变它们的运行环境。例如,线程可能 想要改变它的优先级或它的进程的的优先级。线程常常要改变它的(或它进程的)环境,所以Windows提供一些函数,使得线程能够容易地引用它的进程内核对象。或者用它的线程内核对象 :(FangSH:获得当前的线程和进程的函数)[代码]1、这两个函数都能返回调用线程的进程的伪句柄或线程内核对象的伪句柄。这些函数并不在创建进程的句柄表中创建新句柄。2、调用这些函数对进程或线程内核对象的使用计数没有任何影响。3、如果调用CloseHandle,将伪句柄作为参数来传递,那么CloseHandle就会忽略该函数的调用并返回FALS 阅读全文
摘要:
调用CreateThread可使系统创建一个线程内核对象。该对象的初始使用计数是2(在线程停止运行和从CreateThread返回的句柄关闭之前,线程内核对象不会被撤消)。线程的内核对象的其他属性也被初始化,挂起计数(suspend count)被设置为1,退出代码始终为STILL_ACTIVE(0x103),该对象设置为未通知状态。内核对象一旦创建完成,系统就分配用于线程栈有内存。该内存是从进程的地址空间分配而来的,因为线程并不拥有它自己的地址空间。然后,系统将两个值写入新线程的栈的上端(线程栈总是从内存的高地址向低地址建立)。写入栈的第一个值是传递给CreateThread的pvParam 阅读全文
摘要:
系统提供了一个称为SwitchToThread的函数,使得另一个可调度线程(如果存在能够运行):BOOL SwitchToThread();当调用这个函数的时候,系统要查看是否存在一个迫切需要CPU时间的线程。如果没有线程迫切需要CPU时间,SwitchToThread就会立即返回。如果存在一个迫切需要CPU时间的线程,SwitchToThread就对该线程进行调度(该线程的优先级可能低于调用SwitchToThread的线程)。这个迫切需要CPU时间的线程可以运行一个时间段,然后系统调度程序照常运行。该函数允许一个需要资源的线程强制另一个优先级较低、而目前却拥有该资源的线程放弃该资源(抢占资 阅读全文
摘要:
线程也能告诉系统,它不想在某个时间段内被调度。这是通过调用Sleep函数来实现的:VOID Sleep(DWORDdwMilliseconds);该函数可使线程暂停自己的运行,直到dwMilliseconds过去为止。关于Sleep函数。有下面几个重要问题值得注意:1、调用Sleep,可使线程自愿放弃它剩余的时间片。2、系统将在大约的指定毫秒数内使线程不可调度。如果告诉系统,想睡眠100ms,那么可以睡眠大约这么长时间,但是也可能睡眠数秒钟或者数分钟。记住, Windows不是个实时操作系统。虽然线程可能在规定的时间被唤醒,但是它能否做到,取决于系统中还有什么操作正在进行。3、可以调用Slee 阅读全文
摘要:
在线程内核对象的内部有一个用于指明线程的挂起计数的值。当调用CreateProcess或CreateThread函数时,就创建了线程的内核对象,并且它的挂起计数被初始化为1。这可以防止线程被调度到CPU中。原因是因为线程的初始化需要时间,希望在系统做好充分的准备之后再开始执行线程。当线程完全初始化好了之后, CreateProcess或CreateThread要查看是否已经传递了CRE ATE_ SUSPENDED标志。如果已经传递了这个标志,那么这些函数就返回,同时新线程处于挂起状态。如果尚未传递该标志,那么该函数将线程的暂停计数递减为0。当线程的暂停计数是0的时候,除非线程正在等待其他某种 阅读全文
摘要:
[代码]说明: 此函数调用成功返回TRUE,失败返回FALSE,只表示这个函数是否调用成功而己.不能根据返回值来判断一个线程是否结束,而重点是要根据lpExitCode的值来确定,lpExitCode 值STILL_ACTIVE 表示线程正在运行.若线程己经结束,则lpExitCode中存储指定线程的返回值.FangSH2011-01-05 阅读全文