进程控制系统设计说明书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档