Linux——多线程下解决生产消费者模型

我们学习操作系统,想必对生产消费者问题都不陌生。作为同步互斥问题的一个经典案例,生产消费者模型其实是我们解决实际问题的基础,很多实际问题的解决都会依赖于它。而解决此模型的同步与互斥,在多进程的环境下我们通常是用信号量来解决(可以戳这里看看);而对于多线程的情况,这里就会用到线程间通信的最常用的两个东西:  互斥量和条件变量。通常用它们两个就可以解决多线程下的同步和互斥问题了。好,在具体实现前,要更好理解其中原理,还是先来回顾一下一些相关的知识。

 

 互斥问题

大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。多个线程并发的操作共享变量,会带来一些问题。

// 操作共享变量会有问题的售票系统代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> int ticket = 100; void *route( void *arg) { char id = *(char*)arg; while ( 1 ) { if ( ticket > 0 ) { usleep( 1000) ; printf( " thread %c sells ticket:%d\n" , id, ticket) ; ticket--; } else { break; } } } int main(void) { pthread_t t1, t2, t3, t4; char a1=1,a2=2,a3=3,a4=4; pthread_create( &t1, NULL, route, &a1); pthread_create( &t2, NULL, route, &a2); pthread_create( &t3, NULL, route, &a3); pthread_create( &t4, NULL, route, &a4); pthread_join( t1, NULL) ; pthread_join( t2, NULL) ; pthread_join( t3, NULL) ; pthread_join( t4, NULL) ; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgjzp.html