2

有:

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

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

一个消费者线程“thC”:等待() 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 用作二进制信号量?

.

非常感谢!

4

1 回答 1

1

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

该算法如下所示:

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 信号量是无限的并且不提供原子性。

于 2012-04-26T04:21:42.007 回答