1. 生产者-消费者问题
#define N 100 //有界缓冲区大小
typedef int semaphore //定义信号量
semaphore mutex = 1; //临界区互斥信号量
semaphore empty = N; //空闲缓冲区
semaphore full = 0; //缓冲区初始化为空
void producer(void)
{
int item; //局部变量
wile(1){
item = produce_item(); //生产数据
P(empty); //获取空数据槽
P(mutex); //获取进入临界区的信号量
insert_item(item); // 将数据放入缓冲池
V(mutex); //释放互斥量
V(full); //数据量加一
}
}
void consumer(void)
{
int item; //局部变量
while(1){
P(full); //获取数据槽
P(mutex); //获取进入临界区的信号量
item = remove_item(); //将数据从缓冲池读出
V(mutex); //释放互斥量
V(empty); //数据量减一,即空槽加一
consume_item(item); //消费数据
}
}
读者-写者问题
typedef int semaphore; //定义信号量
semaphore rmutex = 1; //读者计数器的互斥量
semaphore wmutex = 1; //写一写,读一写互斥量
int readcount = 0; //读者计数器
void reader(void) //读者进程
{
while(1){
P(rmutex); //取得读者计数器的互斥量
readcount = readcount+1; //进来一个读者。读者数量加一
if(readcount == 1) P(wnutex); //如果是第一个读者,取得读一写互斥量
V(rmutex); //释放读者计数器的互斥量
read_data_base(); //读数据
P(rmutex); //读者读完数据要离开,先取得读者计数器的互斥量
readcount = readcount - 1; //读者数量减一
if(readcount == 0) V(wmutex); //如果是最后一个离开的读者,释放读一写互斥量
V(rmutex); //释放读者计数器的互斥量
use_dataread();
}
}
void writer(void) //写者进程
{
while(1){
think_up_Data(); //写者产生数据
P(wmutex); //获得写一写,读一写操作互斥量
write_data_base(); //写入数据库
V(wmutex); //释放写一写,读一写操作互斥量
}
}