DYF
我思故我在!
摘要: 六、其他的线程同步函数1、异步设备I/O异步设备I/O使得线程能够启动一个读操作或写操作,但是不必等待读操作或写操作完成。设备对象是可以同步的内核对象,可以调用WaitForSingleObject函数传递文件、套接字和通信端口的句柄。当系统执行异步I/O时,设备对象处于未通知状态。一旦操作完成,系统就将对象的状态改为已通知状态,该线程就知道操作已经完成。线程就可以继续运行。2、DWORD WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds)使线程一直等待,直到hProcess标识的进程在创建应用程序的第一个窗口的线程中已经没有尚未处理 阅读全文
posted @ 2009-05-30 10:24 o(∩_∩)o... 阅读(197) 评论(0) 推荐(0)
摘要: 五、互斥对象内核对象互斥对象内核对象,能够确保线程拥有对单个资源的互斥访问权。互斥对象包含使用计数、线程ID(用于标识系统中的哪个线程当前拥有互斥对象)、递归计数器(用于指明该线程拥有互斥对象的次数)。互斥对象的行为特性与关键代码段相同,但是互斥对象属于内核对象(不同进程中的多个线程能够访问单个互斥对象,并且线程在等待访问资源时可以设定一个超时值)。而关键代码段则属于用户方式对象。互斥对象的运行速度比关键代码段要慢。互斥对象内核对象用于保护由多个线程访问的内存块。保证访问内存块的任何线程拥有对该内存块的独占访问权,这样就能够保证数据的完整性。互斥对象的使用规则:线程ID=0,互斥对象不为任何线 阅读全文
posted @ 2009-05-30 10:23 o(∩_∩)o... 阅读(145) 评论(0) 推荐(0)
摘要: 四、信标内核对象信标内核对象用于资源进行计数。包含:引用计数、最大资源数量(用于标识信标能够控制的资源的最大数量)、当期资源数量(用于标识当前可以使用的资源的数量)。信标的使用规则:当前资源数量大于0,则发出信标信号。0<=前资源数量<=最大资源数量1、创建信标内核对象HANDLE CreateSemaphore(PSECURITY_ATTRIBUTE psa, //安全属性LONG lInitialCount, //资源初始值(即可供使用的资源数)LONG lMaximumCount, //最大资源数量PCTSTR pszName) //命名2、其它线程打开现有信标HANDLE 阅读全文
posted @ 2009-05-30 10:20 o(∩_∩)o... 阅读(177) 评论(0) 推荐(0)
摘要: 三、等待定时器内核对象等待定时器,是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象。通常用来在某个时间执行某个操作。创建等待定时器内核对象HANDLE CreateWaitableTimer(PSECURITY_ATTRIBUTES psa, BOOL fManualReset, PCTSTR pszName); //参数同CreateEvent当发出人工重置的定时器信号通知时,等待该定时器的所有线程均变为可调度线程。当发出自动重置的定时器信号通知时,只有一个等待的线程变为可调度线程。HANDLE OpenWaitableTimer(DWORD dwDesiredAccess, BO 阅读全文
posted @ 2009-05-30 10:19 o(∩_∩)o... 阅读(235) 评论(0) 推荐(0)
摘要: 二、事件内核对象事件内核对象是所有的内核对象中最基本的对象。包含一个使用计数(与所有内核对象一样) ,一个用于指明该事件是自动重置的事件还是人工重置的事件的布尔值。一个用于指明该事件处于已通知状态还是未通知状态的布尔值。事件内核对象的类型:人工重置的事件内核对象,事件得到通知时,等待该事件的所有线程均变为可调度线程。自动重置的事件内核对象,事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。事件的使用(一个线程执行初始化操作,然后通知另一个线程执行剩余操作时用得最多)事件初始化为未通知状态,然后,当该线程完成它的初始化操作后,它就将事件设置为已通知状态。这时,一直在等待该事件的另一个 阅读全文
posted @ 2009-05-30 10:17 o(∩_∩)o... 阅读(218) 评论(0) 推荐(0)
摘要: 进程内核对象,是一个BOOBLE值,进程运行的时候内核对象处于未通知状态(FALSE),当进程终止的时候处于已通知状态(TRUE)。当线程等待的内核对象处于未通知状态时,线程不可调度。当内核对象变为已通知状态时线程立即变为可调度状态并投入运行。可处于已通知态和为通知态的内和对象:进程、线程、作业、文件、控制台输入、文件修改通知、事件、可等待计时器、信标、互斥对象一、等待函数等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);hObject标识一 阅读全文
posted @ 2009-05-30 10:15 o(∩_∩)o... 阅读(246) 评论(0) 推荐(0)
摘要: 关键代码段与循环锁 当线程访问另一个线程拥有的关键代码段时,调用线程就立即被置于等待状态。即该线程从用户态转入内核态。调用EnterCriticalSection函数时它使用循环锁进行循环,设法多次取得该资源。只有每次都失败时,该线程才转入内核态以便进入等待状态。 BOOL InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION pcs, DWORD dwSpinCount); 将循环锁放入关键代码,第一个参数是关键代码段结构的地址,第二个参数是使线程等待之前它试图获得资源时想要循环锁循环迭代的次数。可以是0至0 x 0 0 FFFFFF 阅读全文
posted @ 2009-05-30 10:13 o(∩_∩)o... 阅读(259) 评论(0) 推荐(0)
摘要: 二、高级线程同步 如果线程访问共享资源或者等待一些特殊事件的发生,如果共享资源可用或特殊事件已发生则函数返回同时该进程保持可调度状态,否则该线程处于等待状态。系统将处于等待状态的线程不占用系统资源(不浪费CPU时间),当资源可用或特殊事件发生时将线程处于可调度状态,该线程与资源或特殊事件保持同步。应该避免一个线程(通过不断查询多个线程共享或可以访问的变量的状态)与另一个线程中的任务的完成实现同步三、关键代码段 关键代码段(又叫临界区),即通过一小段代码使进程对共享资源以独占的方式进行访问,让该段代码能以原子操作的方式访问共享资源的一种方法。通过CRITICAL_SECTION结构(临界对象)实 阅读全文
posted @ 2009-05-30 10:10 o(∩_∩)o... 阅读(193) 评论(0) 推荐(0)
摘要: 线程需要通信的情况:• 当有多个线程访问共享资源而不使资源被破坏时。• 当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。原子访问:是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。原子操作:指线程运行过程不中不发生中断。1、互锁函数互锁函数的执行方式与CPU平台相关, x 8 6 C P U,互锁函数会对总线发出一个硬件信号,防止另一个C P U访问同一个内存地址。 LONG InterlockedExchangeAdd(PLONG plAddend, LONG Increment); 将变量的值与指定的数相加后将变量值返回(只能为32位的值),返回该变量 阅读全文
posted @ 2009-05-30 10:07 o(∩_∩)o... 阅读(206) 评论(0) 推荐(0)