2016-04-22 17 views
3

私は、Windows、iOS、OSX上に構築されたクロスプラットフォームアプリケーションを持っています。iOS/OSX SetEvent()とWaitForSingleObject()に相当しますか?

私の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); 
+1

私はあなたのコードベースのクロスプラットフォーム互換性を最大限にしようとしていますが、iOS/MacOSでのマルチスレッドコードの作成は一般的に簡単ですGCDをより完全に使用してください。 [スレッドからの移行](https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/ThreadMigration/ThreadMigration.html#//apple_ref/doc/uid/TP40008091-CH105-SW1)を参照してください。 _Concurrency Programming Guide._ – Rob

答えて

1

これは、基本的権利であるけれども、あなた一般的でしょうdispatch_semaphore_wait意味dispatch_semaphore_create(0)dispatch_semaphore_signalを受け取るまで待つ、すなわち、それは「初期状態がunsignalledのオブジェクト」である)。 1を使用すると、dispatch_semaphore_waitへの最初の呼び出しは、実際に信号を待つことなく即座に満たされます(BigSoundBufferUpdateを一度呼び出すと、そのforループの2回目の繰り返しが信号を待つ)。

+0

自信を持って投票してくれてありがとうございます。私はあなたの答えを受け入れました。 – SparkyNZ

関連する問題