Producer Consumer :生产者 消费者
1. 什么是生产者、消费者?此处和我们日常生活差不多。洗发水工厂是生产者,百姓就是他最忠实的消费者;ATM是生产者,取款的民众就是他的消费者了;学校公司食堂是生产者,食客就是消费者... ... 诸如此类的模型多如牛毛。
2. 这样的生活模型在计算机中如何应用?现代计算机基本上是多任务操作系统(不论是单核CPU还是多核CPU),其调度的基本单位是线程(如何理解线程,参考下方名字大话解释)。不同线程之间如何通信(参考大话名词解释)?生产者,消费者就是一种异步通信通知的机制。
3. 参考以下模型:
void *producer(void *data)
{
pthread_lock(mt);
if ( list is full )
{
pthread_cond_wait( cond_not_full, mt ); //
}
add_queue( list, data );
pthread_cond_signal( cond_not_empty );
pthread_unlock(mt);
}
void *consumer(void * data)
{
pthread_lock(mt);
if ( list is empty )
{
pthread_cond_wait( cond_not_empty, mt ); //
}
delete_queue( list, data );
pthread_cond_signal( cond_not_full );
pthread_unlock(mt);
}
4. 知识串联:生产和消费者 结合 List队列可以办 N 多事情,具体使用场景,不同的Idea不太相同,不在列举。但是代码模型基本一致。
大话名词解释:
线程:它拥有自己或者共享资源,并且大多数情况下是在一个死循环里面跑(按PC地址裸奔)。比如:while(1){ // To do something ; } ; for (;;) { // To do something ;}
目前我使用比较多的是POSIX pthread线程。当然Windows、C++、Android等自己封装的也是不错的。
线程间通信、进程间通信:其实就是两个人(两个线程)拿着两个手机在打电话,你发个Data我,我发个Data你。如此而已。
常用方式:管道,消息队列,共享内存,信号量,Socket等 参考Ebook《Unix进程间通信》
Icekirin.yuan - 冰火麒麟工作室
Q群:147565042