您的位置:首页 > 移动开发 > Objective-C

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: