使用可等候定时器进行线程同步,可等候定时器进行线程同步的原理定时触发,或间隔触发的方式. 在指定间隔的时间通知另一个线程,从而实现同步,精度高,约为100纳秒.
可等候定时器属于内核对象.使用它可以跨进程进行同步.具体实现.
1,函数说明
HANDLE CreateWaitableTimer( LPSECURITY_ATTRIBUTES lpTimerAttributes, // SD 安全属性,一般内核对象都会具有此结构 BOOL bManualReset, // reset type 重置方式,如果为TRUE,则手动重置,如果为FALSE,则为同步定时器 LPCTSTR lpTimerName // object name 内核对象名,可以通过对象名称跨进程获取改定时器, );
BOOL SetWaitableTimer( HANDLE hTimer, // handle to timer 使用上面函数创建成功会返回一个可等候定期的句柄 const LARGE_INTEGER *pDueTime, // timer due time 初始化后,定时器初次启动的时间,正数位为绝对时间,负数为相对时间 LONG lPeriod, // timer interval 启动后,之后每次的间隔时间 PTIMERAPCROUTINE pfnCompletionRoutine, // completion routine 定时器处理函数 LPVOID lpArgToCompletionRoutine, // completion routine parameter 定时器处理函数的参数 BOOL fResume // resume state 是否在系统休眠时休眠 );
下边是主线程与新创建的线程之间的同步.
// WaitableTimer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
/************************************************************************/
/* 使用可等候定时器进行线程同步,可等候定时器进行线程同步的原理定时触发,或间隔触发的方式.
在指定间隔的时间通知另一个线程,从而实现同步,精度高,约为100纳秒*/
/************************************************************************/
DWORD WINAPI ThreadFun(LPVOID);
HANDLE g_hTimer;
int _tmain(int argc, _TCHAR* argv[])
{
//首先创建可等候定时器
g_hTimer=CreateWaitableTimer(NULL,FALSE,NULL) ;
//设置定时器时间
INT64 nDueTime=-10*1000000;
SetWaitableTimer(g_hTimer,(PLARGE_INTEGER)&nDueTime,2000,NULL,NULL,FALSE);
DWORD nThreadID = 0;
HANDLE hThread = CreateThread( NULL, 0, ThreadFun,NULL, 0, &nThreadID );
//等待线程返回
WaitForSingleObject( hThread, INFINITE );
CloseHandle( hThread );
//关闭定时器
CloseHandle( g_hTimer );
return 0;
}
DWORD WINAPI ThreadFun(LPVOID pVoid)
{
LONG i=0;
while(1)
{
//等待定时器时间到达
WaitForSingleObject(g_hTimer,INFINITE);
printf("%d开始执行\n",i++);
}
return 0;
}