#include "windows.h" #include "conio.h" #include "stdio.h" int readcount=0; //读者进程数量 HANDLE rMutex=NULL; //读者互信号量 HANDLE wMutex=NULL; //写者互斥信号量 void Readers() //读者函数 { while(1) { printf("%d 请等待读者。。。\n",GetCurrentThreadId()); WaitForSingleObject(rMutex,INFINITE);//P(r) //第一个读,要等已经在写的写者写完才可以开始读 if(readcount==0){ WaitForSingleObject(wMutex,INFINITE); //P(w) } readcount++; ReleaseMutex(rMutex);//V(r) printf("%d 正在读书。。。请等待1.3秒\n",GetCurrentThreadId()); Sleep(1300); printf("%d 读书结束\n",GetCurrentThreadId()); WaitForSingleObject(rMutex,INFINITE);//P(r) readcount--; printf("读者数量:%d\n",readcount); if(readcount==0){ printf("全部读者结束阅读\n\n"); ReleaseMutex(wMutex); //V(w) } ReleaseMutex(rMutex);//V(r) } } void Writer()//写者函数 { while(1) { printf("\n%d 请等待写者。。。\n",GetCurrentThreadId()); WaitForSingleObject(wMutex,INFINITE);//P(r) printf("写者正在写书!等待 2 秒!\n"); Sleep(2000); ReleaseMutex(wMutex); } } HANDLE ahThread; HANDLE bhThread; HANDLE hThread; int tStop() //停止函数 { int l=getchar(); printf("%d",l); return l; } void Start() //开始函数 { bhThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Readers,NULL,0,NULL); ahThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Writer,NULL,0,NULL); hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)tStop,NULL,0,NULL); //多线程 int IsStop=tStop(); if(IsStop==0) //满足停止条件 { CloseHandle(ahThread); CloseHandle(bhThread); CloseHandle(hThread); } } int main() //主函数 { rMutex = CreateMutex(NULL,FALSE,TEXT("rmutex")); wMutex = CreateMutex(NULL,FALSE,TEXT("wmutex")); Start(); //开始 printf("\n"); return 0; }
时间: 2024-01-05 07:04:03 浏览: 25
此代码实现了经典的读者-写者问题。其中,读者和写者是多个线程,它们需要对共享资源进行访问。为了保证数据的一致性和正确性,需要使用互斥信号量来控制读者和写者之间的访问。
具体地,读者需要先申请读者互斥信号量,如果此时没有写者在写,则可以开始读取共享资源。如果此时有写者在写,则需要等待写者写完再开始读取。读取完后需要释放读者互斥信号量。写者需要先申请写者互斥信号量,如果此时没有读者正在读,则可以开始写入共享资源。如果此时有读者正在读,则需要等待读者读完再开始写入。写入完后需要释放写者互斥信号量。
此代码中还包含了一个停止函数和一个开始函数,可以通过输入的方式控制程序的开始和停止。同时,使用了多线程技术来实现读者和写者的并发执行。
需要注意的是,此代码中存在死锁的可能性。当读者数量和写者数量都很多时,可能会出现读者和写者相互等待的情况,导致程序无法继续执行。因此,在实际应用中需要根据具体情况进行优化。
相关问题
#include<stdio.h> #include<Windows.h>//system #include<time.h>//time #include<conio.h>//kbhit 什么意思
这段代码是C语言的代码,包含了一些头文件的引用。头文件是C语言中用来声明函数和变量的文件,它们包含了一些预定义的函数和变量的声明,以供程序使用。
具体来说,这段代码引用了以下几个头文件:
- `stdio.h`:这个头文件包含了一些输入输出函数的声明,例如`printf`和`scanf`。
- `Windows.h`:这个头文件是Windows系统特有的,包含了一些与Windows系统相关的函数和常量的声明。
- `time.h`:这个头文件包含了一些与时间相关的函数和类型的声明,例如`time`和`ctime`。
- `conio.h`:这个头文件包含了一些与控制台输入输出相关的函数的声明,例如`kbhit`。
这段代码的作用是获取当前系统的时间,并以英文格式输出。具体的代码逻辑如下:
1. 定义一个`time_t`类型的变量`lt`,用来存储时间的长整型值。
2. 使用`time`函数获取当前系统时间,并将其赋值给变量`lt`。
3. 使用`printf`函数将变量`lt`的值以英文格式输出。
这段代码的功能是获取当前系统时间并以英文格式输出。如果你运行这段代码,你将会在控制台上看到当前系统时间的英文格式输出。
#include <stdio.h> #include <conio.h> #include <windows.h> #include <time.h>
这段代码是C语言中的预处理指令,用于在程序中引用一些系统级别的函数和变量。其中,stdio.h是标准输入输出头文件,提供了一些常用的输入输出函数,如printf、scanf等;conio.h是控制台输入输出头文件,提供了一些控制台相关的函数,如getch、clrscr等;windows.h是Windows API头文件,提供了一些Windows系统级别的函数和变量;time.h是时间头文件,提供了一些时间相关的函数和变量。通过引用这些头文件,程序可以使用这些函数和变量,从而实现一些功能。