实现信号量

时间:2012-05-22 22:56:20

标签: semaphore glib

似乎glib提供了互斥和条件作为线程同步原语,但是通用semaphores(从某种意义上说它们支持原始的P和V操作?)我是否理解{{1} }等价于二进制信号量,GCond等同于g_cond_signal,而P等同于g_cond_wait?但是信号量不限于最大值1?

我想到了这样的事情:

V

struct semaphore { int n; GMutex sem_lock; GCond sem_cond; } 操作现在看起来像这样:

P

是否有更简单的方法从glib中获取pthreads'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的功能?

1 个答案:

答案 0 :(得分:2)

asynchronous queue可以用作信号量:

  • 初始化:GAsyncQueue * queue = g_async_queue_new();

  • V操作:g_async_queue_push(queue,GINT_TO_POINTER(1));

  • P操作:g_async_queue_pop(队列);

队列的大小充当信号量的计数器。 g_async_queue_push的第二个参数可以是除NULL之外的任何指针。 但是,如果您想将信号量用于某些消费者/生产者任务,那么发送指向某些数据的指针将非常有用。

在某些情况下,a thread pool可能更适合。