简述:
两进程同步关系,有两个信号量,一个empty一个full。
假设产品缓冲区大小为n,则初值empty=n,full=0。
前操作(生产者):
P(empty)
V(full)
后操作(消费者):
P(full)
P(empty)
如果需要互斥访问缓冲区的话,要保证临界区代码尽量小,且需要避免死锁。
前操作(生产者):
P(empty)
P(mutex)
V(mutex)
V(full)
后操作(消费者):
P(full)
P(mutex)
V(mutex)
P(empty)
代码实现:
#include <stdio.h>
#include <windows.h>
/* 互斥与同步 */
#define N 10 // 缓存区大小
#define COUNT 10 // 模拟次数权重(=总执行次数/生产者线程数/消费者线程数/2)
#define P_TIME 100 // 生产一个产品时间
#define C_TIME 50 // 消耗一个产品时间
#define P_COUNT 5 // 生产者线程数量
#define C_COUNT 3 // 消费者线程数量
HANDLE mutex = CreateMutex(NULL, FALSE, NULL); // 定义互斥量
HANDLE empty = CreateSemaphore(NULL, N, N, NULL); // 缓冲区中空槽数信号量
HANDLE full = CreateSemaphore(NULL, 0, N, NULL); // 缓冲区中满槽数信号量
int buffer[N]; // 有N个槽数的缓冲区buffer[N],并实现循环缓冲队列
int front = 0;