2012-05-22 109 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可能更适合。