似乎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
的功能?
答案 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可能更适合。