单一提供者,单一消费者。哪个适用于条件变量:pthread_cond_t,sem_t或pthread_mutex_t?

时间:2012-04-26 03:39:35

标签: linux pthreads conditional semaphore producer-consumer

有:

一个条件变量“var”:var的值只能是0或1;

一个提供者线程“thP”:当从net接收数据时,设置var 1(可用);

一个消费者线程“thC”:wait()for var。获得var时,将其设置为0(不可用),然后处理。

我发现了两种实现这个简单模型的方法:

(1)使用pthread_cond_t作为var。    此方法需要额外的互斥锁和回调函数来解锁互斥锁,同时清除线程。

(2)使用sem_t作为var。    该方法可能导致“var> 1”的情况。 thC可能会执行多个wait()操作以将var的值减小为1。

问题是:

要实现这个简单模型“单一提供者,单个使用者,一个条件变量”,我应该将哪种类型用于var,pthread_cond_t,sem_t或者仅使用pthread_mutex_t作为二进制信号量?

非常感谢!

1 个答案:

答案 0 :(得分:0)

对于单个使用者,单一提供者,有界队列示例,典型的做法是使用一个锁保护两个条件变量(一个在'队列未满时发出信号,一个在'队列不为空'时发出信号)

算法如下所示:

post(item):
  lock;
  while (queue is full):
    wait(cvar_queue_not_full);
  queue.push(item)
  signal(cvar_queue_not_empty);
  unlock;

consume():
  lock;
  while (queue is empty):
    wait(cvar_queue_not_empty);
  item = queue.shift(item);
  signal(cvar_queue_not_full);
  unlock;
  return item;

这本质上是一个有界的信号量,但允许您以原子方式调整信号量并同时推送/弹出队列。不幸的是,POSIX信号量是无界的,不提供原子性。