用信号量解决生产者消费者问题
-
实验目的
通过实验,掌握Windows和Linux环境下互斥锁和信号量的实现 方法,加深对临界区问题和进程同步机制的理解,同时熟悉利用Windows API和Pthread API进行多线程编程的方法。
-
实验内容
1. 在Windows操作系统上,利用Win32 API提供的信号量机制,编写应 用程序实现生产者——消费者问题。
2. 在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序实现生产者——消费者问题。
3. 两种环境下,生产者和消费者均作为独立线程,并通过empty、full、mutex三个信号量实现对缓冲进行插入与删除。
4. 通过打印缓冲区中的内容至屏幕,来验证应用程序的正确性。
-
实验步骤及运行结果和数据说明
(a)windows下用win32API实现
1.windows下建立多线程,分别表示生产者和消费者,首先引用
分别用来建立线程和引用windows下的函数
创建两个线程,分别用来表示生产者和消费者。
线程的表示函数 consumer和produce
-
main函数的实现
建立线程并关闭线程
-
变量的声明
声明三个信号量emp,full,mutex初值分别为20,0,1
-
生产者消费者的实现
生产者:
做20次循环,每次生产一个,同时empty-1,full+1,mutex保持每次生产的互斥。
消费者:
同样也是20个消费者,但只有full>1时才能进行。
-
实验运行结果
(b)linux下用pthread实现
1.首先是linux下多线程的创建,需要引用pthread.h
同时创建函数为 pthread_creat()
我们创建了生产者和消费者两个线程,名字分别为cunsumer和producer
2. 信号量的声明
在这里,互斥信号量the_mutex用pthread_mutex_t创建,同步信号量 用sem_t创建
信号量的初始:
3. 生产者和消费者函数的具体实现
生产者:
Sem_wait进行信号量的减一操作,sem_post进行信号量的加一操作
Pthread_mutex_lock则相应的对互斥信号量进行操作
消费者:
与生产者类似,不过每次消费时,必须先判断full>0,只有大于0时才能消费