Windows之SignalObjectAndWait
2015-05-29 10:22
441 查看
#include <iostream> #include <Windows.h> #include <process.h> DWORD WINAPI Thread1(PVOID pParam); DWORD WINAPI Thread2(void* pParam); void Thread3(void * pParam); HANDLE g_hEvent ; HANDLE g_hEvent2 ; HANDLE g_hMutex ; int main() { g_hEvent2 = CreateEvent(NULL,TRUE,FALSE,NULL); g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); HANDLE hThread1 = CreateThread(NULL,0,Thread1,NULL,0,NULL); HANDLE hThread2 = CreateThread(NULL,0,Thread2,NULL,0,NULL); int p = _beginthread(Thread3,0,NULL); std::cout<<" p :"<<p<<std::endl; system("pause"); return 0 ; } DWORD WINAPI Thread1(PVOID pParam) { Sleep(100);//Waiting and letting thread3 to start first. WaitForSingleObject(g_hMutex,INFINITE); std::cout<<"Thread1 WaitForSingleObject SetEvent Thread1"<<std::endl; SetEvent(g_hEvent);//使事件g_hEvent处于触发状态,让Thread2运行 ReleaseMutex(g_hMutex); return 0 ; } DWORD WINAPI Thread2(PVOID pParam) { WaitForSingleObject(g_hEvent,INFINITE); std::cout<<" Thread2 SetEvent g_hEvent2 Thread2"<<std::endl; SetEvent(g_hEvent2); ResetEvent(g_hEvent);//手动重置 return 0 ; } void Thread3(void * pParam) { WaitForSingleObject(g_hMutex,INFINITE);//等待互斥量 std::cout<<" Thread3 WaitForSingleObject g_hMutex Thread3"<<std::endl; SignalObjectAndWait(g_hMutex,g_hEvent2,INFINITE,FALSE);//释放第一个参数的内核对象,等待第二个参数的内核对象 std::cout<<" Thread3 SignalObjectAndWait Thread3"<<std::endl; ResetEvent(g_hEvent2);//手动重置 return ; }
显示结果:主线程打印P:---->线程3:成功等待互斥量对象--->主线程打印:56---> p : Thread3 WaitForSingleObject g_hMutex Thread3 56 请按任意键继续. . . Thread1 WaitForSingleObject SetEvent Thread1 Thread2 SetEvent g_hEvent2 Thread2 Thread3 SignalObjectAndWait Thread3
SignalObjectAndWait函数会通过一个原子操作来触发一个内核对象,并等待另一个内核对像。 DWORD SignalObjectAndWait( HANDLE hObjectToSignal,//必须是一个互斥量,信号量或者事件,其他的类型将会返回WAIT_FAILED,相当于调用了ReleaseMutex,ReleaseSemphore,SetEvent操作 HANDLE hObjectToWaitOn,//等待的对象可以是:互斥量,信号量,事件,计时器,进程,线程,作业,控制台输入以及变更通知。 DWORD dwMilliseconds,//等待时间 BOOL bAlertable);//表示当线程处于等待状态的时候,是否应该对添加到队列中的异步调用进行处理
返回值:WAIT_OBJECT_0,WAIT_TIMEOUT,WAIT_FAILED,WAIT_ABANDONED或者WAIT_IO_CONPLEMTION。
<span style="white-space:pre"> </span>如: SignalObjectAndWait(hMutex,hEvent,INFINITE,FALSE); 相当于调用了如下操作: ReleaseMutex(hMutex); WaitForSingleObject(hEvent,INFINITE);
相关文章推荐
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- Chapter12. Foundation Classes and selector in Objective-C
- oc中谓词的使用(NSPredicate)
- 调用nil对象的方法(Calling Methods on Nil)
- oc中数组的四种遍历方式及比较
- IOS开发学习27 ObjectC 自带json解析方法的使用
- Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved tran
- 泛型限定<? extends Object>
- Getting SharePoint objects (spweb, splist, splistitem) from url string
- insufficient permission for adding an object to repository database ./objects
- Objective-C 类继承关系
- 继承自NSObject的类不能用CGRect
- ObjectC 类的一些问题解析
- Objective_C学习日记(1)--OC中类和实例的基本使用
- Python Dict -> Object
- c字符串与NSString之间的转换
- Objective-C语言的一些基础特性
- JavaScript中ActiveXObject对象
- OC中的构造函数
- 2011斯坦福大学iOS应用开发教程学习笔记(第三课)Objective-C