2012-05-22 103 views
3

似乎glib提供了互斥體和條件作爲線程同步原語,但通用semaphores(從它支持原始P和V操作的意義上說)我正確理解GCond等同於二進制信號量,其中g_cond_signal相當於P,而g_cond_wait相當於V?但是,信號量不限於最大值1?實現信號量

我認爲是這樣的:

struct semaphore { 
    int n; 
    GMutex sem_lock; 
    GCond sem_cond; 
} 

P操作現在看起來是這樣的:

void semaphore_P (struct semaphore *sem) 
{ 
    g_mutex_lock(sem->sem_lock); 
    while (sem->n == 0) 
    g_cond_wait(sem->sem_cond, sem->sem_lock); 
    --sem->n; 
    g_mutex_unlock(sem->sem_lock); 
} 

有沒有一種簡單的方法來獲得其中的並行線程sem_wait功能和sem_post從glib內?

回答

2

asynchronous queue一個可以用作信號量:

  • 初始化:GAsyncQueue *隊列= g_async_queue_new(); g_async_queue_push(queue,GINT_TO_POINTER(1)); g_async_queue_push(隊列,GINT_TO_POINTER(1)); g_async_queue_push(隊列,GINT_TO_POINTER(1)); g_async_queue_push

  • P操作:g_async_queue_pop(queue);

的隊列的大小作爲信號量的計數器。 g_async_queue_push的第二個參數可以是除NULL以外的任何指針。 但是,如果您想爲一些消費者/生產者任務使用信號量,那麼發送指向某些數據的指針將會很有用。

在某些情況下,a thread pool可能更適合。