我有一个跨平台的应用程序,可在Windows,iOS和OSX上构建。

在我的Windows应用程序中,我创建一个初始状态为Unsignalled的Event对象。我有一个线程,它通过调用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为止;即,它是“初始状态为未签名的对象”)。如果您使用1,则将立即满足对dispatch_semaphore_wait的第一次调用,而不实际等待任何信号(尽管在调用BigSoundBufferUpdate一次之后,该for循环的第二次迭代将等待一个信号)。

10-06 14:32