六、其他的线程同步函数
1、异步设备I/O
异步设备I/O使得线程能够启动一个读操作或写操作,但是不必等待读操作或写操作完成。设备对象是可以同步的内核对象,可以调用WaitForSingleObject函数传递文件、套接字和通信端口的句柄。当系统执行异步I/O时,设备对象处于未通知状态。一旦操作完成,系统就将对象的状态改为已通知状态,该线程就知道操作已经完成。线程就可以继续运行。
2、DWORD WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds)
使线程一直等待,直到hProcess标识的进程在创建应用程序的第一个窗口的线程中已经没有尚未处理的输入为止。用于父进程创建子进程,父进程的线程想要知道子进程何时完成初始化,唯一的办法是等待,直到子进程不再处理任何输入为止。
3、MsgWaitForMultipleObjects
DWORD MsgWaitForMultipleObjects(DWORD dwCount, PHANDLE phObjects,BOOL fWaitAll,
DWORD dwMilliseconds, DWORD dwWakeMask);
DWORD MsgWaitForMultipleObjectsEx(DWORD dwCount, PHANDLE phObjects,
DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags);
主要区别在于前者允许线程在内核对象变成已通知状态或窗口消息需要调度到调用线程创建的窗口中时被调度。创建窗口和执行与用户界面相关的任务的线程应调MsgWaitForMultipleObjectsEx函数,而不该调用MsgWaitForMultipleObjects函数,因为后面这个函数将使线程的用户界面无法对用户作出响应。
- WaitForDebugEvent:
Wi n d o w s将调试支持特性内置于操作系统之中。当调试程序启动运行时,它将自己附加给一个被调试程序。该调试程序只需闲置着,等待操作系统将与被调试程序相关的调试事件通知它。调试程序通过调用WaitForDebugEvent函数来等待这些事件的发生:
BOOL WaitForDebugEvent(PDEBUG_EVENT pde,DWORD dwMilliseconds);
当调试程序调用该函数时,调试程序的线程终止运行,系统将调试事件已经发生的情况通知调试程序,方法是允许调用的WaitForDebugEvent函数返回。p d e参数指向的结构在唤醒调试程序的线程之前由系统填入信息。该结构包含了关于刚刚发生的调试事件的信息。
- SingleObjectAndWait:
用于在单个原子方式的操作中发出关于内核对象的通知并等待另一个内核对象。
DWORD SingleObjectAndWait( HANDLE hObjectToSignal, HANDLE hObjectToWaitOn,
DWORD dwMilliseconds, BOOL fAlertable);
hObjectToSignal参数必须标识一个互斥对象、信标对象或事件。hObjectToWaitOn参数用于标识下列任何一个内核对象:互斥对象、信标、事件、定时器、进程、线程、作业、控制台输入和修改通知。dwMilliseconds参数指明该函数为了等待该对象变为已通知状态,应该等待多长时间,而fAlertable标志则指明线程等待时该线程是否应该能够处理任何已经排队的异步过程调用。