【发布时间】:2015-11-14 22:43:54
【问题描述】:
我有一个 waitable timer 的句柄,可以在我的 Windows 服务中的许多正在运行的线程之间共享,用于 API,例如 CreateWaitableTimer、WaitForSingleObject、SetWaitableTimer 和 CancelWaitableTimer。
我的问题是,我是否需要通过互斥锁或临界区同步访问(读/写)这个 HANDLE 本身?
编辑: 好的,我想我需要澄清一下(用代码):
//Say, I have a global handle
HANDLE ghWaitableTimer = NULL; //Originally set to NULL
...
//Thread one
if(!ghWaitableTimer)
{
ghWaitableTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);
}
...
//Thread two
if(ghWaitableTimer)
{
::SetWaitableTimer(ghWaitableTimer, &liWhen, 0, NULL, NULL, FALSE);
}
...
//Thread three
if(ghWaitableTimer)
{
::WaitForSingleObject(ghWaitableTimer, INFINITE);
}
或者我需要这样做:
//Say, I have a global handle
HANDLE ghWaitableTimer = NULL; //Originally set to NULL
CRITICAL_SECTION CriticalSection; //Must be initialized before it's used
...
//Thread one
::EnterCriticalSection(&CriticalSection);
if(!ghWaitableTimer)
{
ghWaitableTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);
}
::LeaveCriticalSection(&CriticalSection);
...
//Thread two
::EnterCriticalSection(&CriticalSection);
HANDLE hTimer = ghWaitableTimer;
::LeaveCriticalSection(&CriticalSection);
if(hTimer)
{
::SetWaitableTimer(hTimer, &liWhen, 0, NULL, NULL, FALSE);
}
...
//Thread three
::EnterCriticalSection(&CriticalSection);
HANDLE hTimer = ghWaitableTimer;
::LeaveCriticalSection(&CriticalSection);
if(hTimer)
{
::WaitForSingleObject(hTimer, INFINITE);
}
【问题讨论】:
-
无论你在做什么,它听起来'关闭':(
-
@MartinJames 为什么?我在这里没有看到问题(除了不必要担心同步同步,这是问题)
-
@deviantfan 好吧,我不确定。我一直在努力思考一些需要多个线程在同一个计时器上等待的要求。我想不出一个。也许只是我:)
-
我的意思是,事件有很多问题;如果多个线程在一个 MRE 上等待,它会被设置,然后立即被一个正在等待的线程重置,任何其他正在等待但没有从准备好运行的线程,在没有实际运行的情况下再次设置回等待全部。所以,我有点担心这同样适用于定时器——也许如果一个线程被设置为运行并重新启动定时器等待,其他一些正在等待的线程可能不会运行......?
-
如果我有这样的要求,我会让一个线程在计时器上等待并发出一个单独的同步信号(事件或信号量)。对于每个其他等待线程。
标签: c++ c windows winapi thread-synchronization