4

似乎 glib 提供了互斥锁和条件作为线程同步原语,但是通用信号量呢(从某种意义上说它们支持原始的 P 和 V 操作?)我是否正确理解 aGCond等同于二进制信号量,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);
}

有没有更简单的方法可以从 glib中获取 pthreads 的功能sem_waitsem_post

4

1 回答 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 之外的任何指针。但是,如果您想将信号量用于某些消费者/生产者任务,那么发送指向某些数据的指针将很有用。

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

于 2013-08-31T16:19:50.560 回答