c语言 同步锁,C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题.docx...

本文详细介绍了如何使用C/C++等编程语言通过信号量机制实现进程同步、生产者消费者问题、哲学家就餐问题和读写者问题的多线程编程解决方案。包括了具体代码示例和实验要求,旨在通过实际操作理解并发控制的关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第 PAGE # 页 共 21 页

第 PAGE # 页 共 21 页

第1 页共21 页

《操作系统原理》上机作业(报告)

作业:信号量机制

作业:

信号量机制

作业编号

8

题目

信号量机制

作业

【题目要求】通过多线程编程模拟进程的同步,互斥及信号量机制的 经典问题。

(1)编程解决下图(前趋图)问题,使得 5 个线程按该图要求运行,

要求其中 P1~P5代表 5个代码块,每个代码块分别由 1 个线程运行模拟, 每个代码块执行时分别可以打印输出该代码块的名称 ( P1~P5),每个 代码块运行时需要睡眠( sleep())一定时间。

要求

(2)利用多线程编程和信号量机制模拟生产者消费者问题(多生产 者和多消费者)。

(3)利用多线程编程和信号量机制模拟哲学家就餐问题, 至少实现 1 种不会出现死锁的方案。

(4)利用多线程编程和信号量机制模拟读写者问题。

实验要求】 可选编程语言: C/C++/Java/C#/Python; 一个小题实现在同一个程序文件中( C/C++ ); 请适当注释;

报 告 正 文(运行屏幕截图及源代码)

截图。

1.

2.

3.哲学家就餐。 (三种方法)

(1)只有双手都拿到筷子,才让其他人去拿。

2)偶数号先拿左边筷子,再拿右边筷子。奇数先拿右边筷子,再拿左边筷子。

3)最多允许四个哲学家就餐。

4.读写者问题。

第 PAGE # 页共21 页

第 PAGE # 页共21 页

代码。

1.

#include #include #include

#include

sem_t s1,s2,s3,s4;

void run1(void);

void run2(void);

void run3(void);

void run4(void);

void run5(void);

void compute(void);

int main()

{

pthread_t t1, t2, t3, t4, t5;

sem_init(&s1,0,0);

sem_init(&s2,0,0);

sem_init(&s3,0,0);

sem_init(&s4,0,0);

pthread_create(&t1, NULL, run1, NULL); pthread_create(&t2, NULL, run2, NULL); pthread_create(&t3, NULL, run3, NULL); pthread_create(&t4, NULL, run4, NULL); pthread_create(&t5, NULL, run5, NULL);

pthread_join(t1, NULL); pthread_join(t2, NULL); pthread_join(t3, NULL); pthread_join(t4, NULL); pthread_join(t5, NULL);

return 0;

}

void run1(void)

{

//sleep(2);

第 PAGE # 页共21 页

第 PAGE # 页 共 21 页

printf("P1 代码块开始运行 ...\n\n");

sem_post(&s1);

}

void run2(void)

{

// sleep(2);

printf("P2 代码块开始运行 ...\n\n");

sem_post(&s2);

}

void run3(void)

{

// sleep(2);

sem_wait(&s1);

sem_wait(&s2);

printf("P3 代码块开始运行 ...\n\n");

sem_post(&s3);

sem_post(&s4);

}

void run4(void)

{

// sleep(2); sem_wait(&s3);

printf("P4 代码块开始运行 ...\n\n");

}

void run5(void)

{

// sleep(2); sem_wait(&s4);

printf("P5 代码块开始运行 ...\n\n");

}

2.

#include

#include

#include

#include

//资源型信号量 sem_t empty; sem_t full;

//可消费数产品指针

int consume_index = 0;

int sn = 0;

//存放产品指针

int product_index = 0;

int sum = 0;

sem_t semaphore_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值