有:
一个条件变量“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作为二进制信号量?
非常感谢!
答案 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信号量是无界的,不提供原子性。