进程控制系统设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学
课程设计说明书
学院、系:软件学院
专业:软件工程
班级:13140A05
学生姓名:学号:
设计题目:基于Windows的线程控制与同步
起迄日期: 2015年12月28日~2016年1月8日指导教师:
日期: 2015年12月25日
一、设计目的
进程同步是处理机管理中一个重要的概念。本设计要求学生理解和掌握Windows中线程控制与同步机制的相关API函数的功能,能够利用这些函数进行编程。
二、任务概述
(1)实现生产者-消费者问题。
(2)实现读/写者问题。
(3)实现哲学家就餐问题。
三、总体设计
(1)生产者-消费者问题。是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
(2)读/写者问题。创建一个控制台程序,此程序包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先或写者优先的读者-写者问题。
(3)实现哲学家就餐问题。用来演示在并行计算中多线程同步(Synchronization)时产生的问题。在1971年,著名的计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份共享的磁带驱动器。稍后,这个问题被托尼·霍尔重新表述为哲学家就餐问题。这个问题可以用来解释死锁和资源耗尽。有服务生解法,资源分级解法,Chandy/Misra解法。
四、详细设计函数
(1)生产者-消费者问题
#include
#include
#include
#include
#define MAX 20 //定义缓冲池的最大容量是20
int count;
void Proclucer()
{
int k,a=0;
while(1)
{
if(count >= MAX)
{
printf("缓冲池已满!等待2 秒!\n");
Sleep(1000);
}
else
{
k=rand();
if(k%2==0)
{
a++;
count++;
printf("生产了一个产品!当前产品的数量是: %d 生产产品总数:%d \n\n",count,a);
}
Sleep(600);
}
}
}
void Consumer()
{
int k,b=0;
while(1)
{
if(count <= 0)
{
printf("缓冲池已空!等待2 秒!\n");
Sleep(1000);
}
else
{
k=rand();
if(k%2!=0)
{
b++;
count--;
printf("取出了一个产品!当前产品的数量是: %d 取出产品总数:%d\n",count,b);
}
Sleep(600);
}
}
}
int tStop() //创建一个停止函数
{
getch();
return 11;
}
void Start()
{
int m;
HANDLE
ahThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Proclucer,NULL,0,NULL); HANDLE
bhThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Consumer,NULL,0,NULL); HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)tStop,NULL,0,NULL); m=tStop();
if(m==11)
{
CloseHandle(ahThread);
CloseHandle(bhThread);
CloseHandle(hThread);
printf("\nClose Thread Success!\nh");
}
}
int main()
{
Start();
printf("\n");
}
(2)读/写者问题
#include
#include
#include
//设置控制台输出颜色
BOOL SetConsoleColor(WORD wAttributes)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INV ALID_HANDLE_V ALUE)
return FALSE;
return SetConsoleTextAttribute(hConsole, wAttributes);
}
const int READER_NUM = 5; //读者个数
//关键段和事件
CRITICAL_SECTION g_cs, g_cs_writer_count;
HANDLE g_hEventWriter, g_hEventNoReader;
int g_nReaderCount;
//读者线程输出函数(变参函数的实现)
void ReaderPrintf(char *pszFormat, ...)
{
va_list pArgList;
va_start(pArgList, pszFormat);
EnterCriticalSection(&g_cs);
vfprintf(stdout, pszFormat, pArgList);
LeaveCriticalSection(&g_cs);
va_end(pArgList);
}
//读者线程函数
unsigned int __stdcall ReaderThreadFun(PVOID pM)
{
ReaderPrintf(" 编号为%d的读者进入等待中...\n", GetCurrentThreadId());
//等待写者完成
WaitForSingleObject(g_hEventWriter, INFINITE);
//读者个数增加
EnterCriticalSection(&g_cs_writer_count);
g_nReaderCount++;
if (g_nReaderCount == 1)
ResetEvent(g_hEventNoReader);
LeaveCriticalSection(&g_cs_writer_count);