发布时间 : 星期二 文章操作系统实验题目及实验报告要求 - 图文更新完毕开始阅读
int main() {
//创建各个互斥信号
g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); //调整下面的数值,可以发现,当生产者个数多于消费者个数时, //生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 3; //生产者的个数 const unsigned short CONSUMERS_COUNT = 1; //消费者的个数 //总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreads[PRODUCERS_COUNT]; //各线程的handle
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符 DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符 //创建生产者线程
for (int i=0;i hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]); if (hThreads[i]==NULL) return -1; } //创建消费者线程 for (int j=0;j hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]); if (hThreads[j]==NULL) return -1; } while (g_continue) { if (getchar()) { //按回车后终止程序运行 g_continue = false; } } return 0; } //生产一个产品。简单模拟了一下,仅输出新产品的ID号 void Produce() { std::cerr << \ std::cerr << \} //把新生产的产品放入缓冲区 void Append() { std::cerr << \ g_buffer[in] = ProductID; in = (in+1)%SIZE_OF_BUFFER; std::cerr << \ //输出缓冲区当前的状态 for (int i=0;i //从缓冲区中取出一个产品 void Take() { std::cerr << \ ConsumeID = g_buffer[out]; out = (out+1)%SIZE_OF_BUFFER; std::cerr << \ //输出缓冲区当前的状态 for (int i=0;i //消耗一个产品 void Consume() { std::cerr << \ std::cerr << \//生产者 DWORD WINAPI Producer(LPVOID lpPara) { while (g_continue) { WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); } return 0; } //消费者 DWORD WINAPI Consumer(LPVOID lpPara) { while (g_continue) { WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); } return 0; } 六、实验体会或对改进实验的建议 1、实验程序复杂,很容易出现错误; 2、在运行的时候,刚开始程序中出现了一个错误,就是重复用了i来定义变量,后来出错,就给变成j; 3、运行结果时,如果没有按回车键,此程序会一直运行下去,类似一个死循环; 七、参考资料 南昌大学实验报告 ---(3)编程实现银行家安全算法 学生姓名: 余长华 学号:6100509114 专业班级: 管理科学与工程类093班 实验类型:□ 验证 □ 综合 ■ 设计 □ 创新 实验日期: 实验成绩: 一、实验目的 通过实验加强对银行家安全算法的理解和掌握。 二、实验内容 熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。 三、实验要求 1、需写出设计说明; 2、设计实现代码及说明 3、运行结果; 四、主要实验步骤 #include \ #include \ #include \ #define alloclen sizeof(struct allocation) #define maxlen sizeof(struct max) #define avalen sizeof(struct available) #define needlen sizeof(struct need) #define finilen sizeof(struct finish) #define pathlen sizeof(struct path) struct allocation { int value; struct allocation *next; }; struct max { int value; struct max *next; }; struct available /*可用资源数*/ {