当前位置: 技术问答>linux和unix
单个生产者线程,单个消费者线程,用 cond、mutex还是sem?
来源: 互联网 发布时间:2017-02-19
本文导语: 现有两个线程 P,C: 当线程 P 接受到来自网络的数据时,会给一个信号表示 C 可以开始工作了(条件变量var); 当线程 C wait 到 var 时,将 var 置为不可用并开始工作。 var 的值只有 0 和...
现有两个线程 P,C:
当线程 P 接受到来自网络的数据时,会给一个信号表示 C 可以开始工作了(条件变量var);
当线程 C wait 到 var 时,将 var 置为不可用并开始工作。
var 的值只有 0 和 1,即条件变量。
现在程序分别用 pthread_cond_t 和 sem_t 均实现了 var。
前者使用还要上锁和注册线程处理函数;
后者存在 var 值 >1 的情况,C wait 时还要循环自检 var 至 1 时才开始工作。
问题:
对于“单个生产者线程,单个消费者线程,两者同步使用条件变量而不是信号量”的这种模型,使用那种方式比较妥当:
(1)var 用 pthread_cond_t 来实现;
(2)var 用 sem_t 来实现;
(3)var 直接用 pthread_mutex_t 来实现。
望达人指教,谢谢!
当线程 P 接受到来自网络的数据时,会给一个信号表示 C 可以开始工作了(条件变量var);
当线程 C wait 到 var 时,将 var 置为不可用并开始工作。
var 的值只有 0 和 1,即条件变量。
现在程序分别用 pthread_cond_t 和 sem_t 均实现了 var。
前者使用还要上锁和注册线程处理函数;
后者存在 var 值 >1 的情况,C wait 时还要循环自检 var 至 1 时才开始工作。
问题:
对于“单个生产者线程,单个消费者线程,两者同步使用条件变量而不是信号量”的这种模型,使用那种方式比较妥当:
(1)var 用 pthread_cond_t 来实现;
(2)var 用 sem_t 来实现;
(3)var 直接用 pthread_mutex_t 来实现。
望达人指教,谢谢!
|
互斥锁其实就可以看作是一种二值信号量。
加锁=信号值减去1,变成0
解锁=信号值加上1,变成1
从效率上说,信号量的效果是最好的,而直接用互斥锁实现是最简单的。
加锁=信号值减去1,变成0
解锁=信号值加上1,变成1
从效率上说,信号量的效果是最好的,而直接用互斥锁实现是最简单的。
|
一对一,信号量和互斥锁都可以的;多对一,我用互斥锁,信号量我用的很少。