2016-04-22 63 views
3

我有一個跨平臺的應用程序,建立在Windows,iOS和OSX上。iOS/OSX等價的SetEvent()和WaitForSingleObject()?

在我的Windows應用程序中,我創建了一個具有未標記初始狀態的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編程指南._ – Rob

回答

1

這基本上是正確的,但你通常會dispatch_semaphore_create(0)(這意味着dispatch_semaphore_wait將等待,直到它收到dispatch_semaphore_signal;即,它是「一個初始狀態未標記的對象」)。如果您使用1,第一次調用dispatch_semaphore_wait將立即得到滿足,而不是實際等待任何信號(儘管在調用BigSoundBufferUpdate一次後,該for循環的第二次迭代將等待信號)。

+0

感謝您的信任投票 - 我已經接受您的答案。 – SparkyNZ

相關問題