实现一个信号量

4
似乎glib提供互斥锁和条件作为线程同步原语,但是关于通用的信号量(在支持原始P和V操作的意义上),有什么办法吗?我正确理解GCond等同于二进制信号量,其中g_cond_signal等同于Pg_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);
}

在glib中有没有更简单的方法来获取pthread的sem_waitsem_post的功能?

1个回答

4

异步队列可以用作信号量:

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

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

  • P操作: g_async_queue_pop(queue);

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

在某些情况下,线程池可能更加适合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接