iOS/OSX SetEvent() 和 WaitForSingleObject() 是否等效?
iOS/OSX Equivalent of SetEvent() and WaitForSingleObject()?
我有一个基于 Windows、iOS 和 OSX 的跨平台应用程序。
在我的 Windows 应用程序中,我创建了一个初始状态为未发出信号的事件对象。我有一个线程等待通过调用 WaitForSingleObject() 发出此事件的信号。 WaitForSingleObject() 阻塞线程的处理,直到另一个线程调用 SetEvent()。
如何使用 GCD dispatch_semaphore_wait() 和 dispatch_semaphore_signal() 实现相同的行为?
我试过以下方法:
子线程:
void *UpdateThread( void *pParams )
{
for( ;; )
{
// Decrease the semaphore count, similar to sem_wait()
dispatch_semaphore_wait( g_hEvtNeedMore, DISPATCH_TIME_FOREVER );
BigSoundBufferUpdate();
}
}
// SetEvent() - Windows equivalent
void SetEvent( dispatch_semaphore_t sem )
{
// Increase semaphore count - similar to sem_post()
dispatch_semaphore_signal( sem );
}
主线程:
g_hEvtNeedMore = dispatch_semaphore_create( 1 ); // Not sure if initial value should be 0 or 1
pthread_create( &hUpdateThread, NULL, UpdateThread, NULL );
...
// Tell the child thread we want more data..
SetEvent( g_hEvtNeedMore );
这基本上是正确的,尽管您通常会 dispatch_semaphore_create(0)
(这意味着 dispatch_semaphore_wait
将等待直到收到 dispatch_semaphore_signal
;即 "an object with an initial state of unsignalled")。如果您使用 1
,对 dispatch_semaphore_wait
的第一次调用将立即得到满足,实际上不会等待任何信号(尽管在调用 BigSoundBufferUpdate
一次后, for
的第二次迭代循环将等待信号)。
我有一个基于 Windows、iOS 和 OSX 的跨平台应用程序。
在我的 Windows 应用程序中,我创建了一个初始状态为未发出信号的事件对象。我有一个线程等待通过调用 WaitForSingleObject() 发出此事件的信号。 WaitForSingleObject() 阻塞线程的处理,直到另一个线程调用 SetEvent()。
如何使用 GCD dispatch_semaphore_wait() 和 dispatch_semaphore_signal() 实现相同的行为?
我试过以下方法:
子线程:
void *UpdateThread( void *pParams )
{
for( ;; )
{
// Decrease the semaphore count, similar to sem_wait()
dispatch_semaphore_wait( g_hEvtNeedMore, DISPATCH_TIME_FOREVER );
BigSoundBufferUpdate();
}
}
// SetEvent() - Windows equivalent
void SetEvent( dispatch_semaphore_t sem )
{
// Increase semaphore count - similar to sem_post()
dispatch_semaphore_signal( sem );
}
主线程:
g_hEvtNeedMore = dispatch_semaphore_create( 1 ); // Not sure if initial value should be 0 or 1
pthread_create( &hUpdateThread, NULL, UpdateThread, NULL );
...
// Tell the child thread we want more data..
SetEvent( g_hEvtNeedMore );
这基本上是正确的,尽管您通常会 dispatch_semaphore_create(0)
(这意味着 dispatch_semaphore_wait
将等待直到收到 dispatch_semaphore_signal
;即 "an object with an initial state of unsignalled")。如果您使用 1
,对 dispatch_semaphore_wait
的第一次调用将立即得到满足,实际上不会等待任何信号(尽管在调用 BigSoundBufferUpdate
一次后, for
的第二次迭代循环将等待信号)。