闽江学院。
课程设计说明书。
题目: 线程互斥的演示。
院系: 闽江学院计算机科学系。
专业班级: 08计本2班
学号: 120081101206
学生姓名: 林超、张嘉、蔡淅荣。
戴艺君、丘富铨
指导教师: 张小进老师
2024年 01月06日。
需求分析。要求:
在windowsxp下调用winapi函数,编写一个c++程序实现:创建一个10个节点的单向链表,每个节点包含一个next指针域和一个num域(整型);再创建两个线程,在第一个线程中摘除前5个节点并正向输出链表后5个节点的num域,在第二个线程中逆向输出链表的num域;要求对链表的操作必须是互斥执行,并能演示在非互斥时出错的现象。
具体需求:1、创建一条含有十个节点的链表,链表包含指针域跟数据域。
2、创建两个线程,使两个线程并发执行。
3、第一个线程正向删除链表前五个节点。
4、第二个线程反向输出节点内容,直到输出链表的头。
5、创建互斥信号量,以保证两个线程对链表的操作正常执行。
6、能够演示非互斥情况下两个线程对链表操作出现的错误情况。
7、无测试数据。
概要设计。说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的(调用)关系。
handle mutex两个线程的互斥信号量。
bool t1,t2用来标识两个线程是否结束,false结束。
bool safe = true用来标识是否采用互斥手段,true为互斥,false为非互斥。
typedef struct link
char * buf;
link * prev;
link * next;
bool isdelete;
link链表节点的定义。
link * head,*tail链表的头尾指针。
void p(handle &singlemutex) p操作,用于获取信号量。
void v(handle &singlemutex) v操作,用于释放信号量。
void initlink初始化链表的十个节点。
void deletenode(link* link) 从链表中删除节点。
dword winapi thread1(void *data) 线程1,用来删除节点。
dword winapi thread2(void *data) 线程2,用来输出节点。
详细设计。根据概要设计中定义的所有数据类型,每个操作算法如下;
#include
#include <>
#include <>
#include <>
using namespace std;
handle mutex = createmutex(null,false,null); 两个线程的互斥信号量。
bool safe = false;
bool t1,t2用来标识两个线程是否结束,false结束。
bool safe = true用来标识是否采用互斥手段,true为互斥,false为非互斥。
typedef struct link
char * buf;
link * prev;
link * next;
bool isdelete;
link链表节点的定义。
link * head,*tail链表的头尾指针。
void p(handle &singlemutex) /p操作,用于获取信号量。
::waitforsingleobject(singlemutex,infinite);
void v(handle &singlemutex) /v操作,用于释放信号量。
releasemutex(singlemutex);
void initlink初始化链表的十个节点。
link * link,*temp;
head = link = new link;
head->prev = head->next = null;
head->buf = new char[80];
sprintf(head->buf,"%d",0);
for (int i=1;i<10;i++)
void deletenode(link* link) /从链表中删除节点。
link *temp = link;
if(link==null)
return;
if(link==head)
dword winapi thread1(void *data) /线程1
link *link = null;
for(int i=0;i<5;i++)
cout<<"delete ok!" cout<<"p1 over"< return 0; dword winapi thread2(void *data) link* link ; if(safe) p(mutex); link = tail; while (true) cout<<"buf<<"n"; if(safe) v(mutex 这里上下的v、p操作是为了能够保证能够提供一个间隙使线程一能够执行。 if(safe) p(mutex); link = link->prev; if(link==null) break; if(safe) v(mutex); cout<<"p2 over"< t2 = false; return 0; int main() unsigned long threadid; while(true) return 0; 下面是简要的流程图。 调试分析。调试过程**现的问题: 1、互斥变量可以进行多次p操作。 答:由于windows api的了解较少,发现一个线程可以对一个互斥变量进行多次的p操作,当然也要进行多次的v操作才行,当时不知道这个情况,所以调试了很久,最后上网找到资料。 2、节点删除出错。 答:由于节点删除后没有进行相应的连接,所以出现了节点连接不上的情况,发现问题后马上进行修复。 用户手册。线程互斥模拟演示软件用户手册。 软件有7个功能按钮。 1.单击单次非互斥按钮模拟线程非互斥情况下的两个并发线程的并发执**况。 2.单击单次互斥按钮模拟线程互斥情况下的两个并发线程的并发执**况。 3.单击循环互斥按钮模拟检测两个并发进程单次互斥的多次运行下能够并发执行的过程。 4.单击结束循环互斥按钮结束循环互斥运行。 5.单击清屏按钮用户可以清除输出内容。 6.单击字体按钮用户可以更改字体设置。 7.单击说明按钮用户可以查阅软件备注说明。 测试结果。测试结果如下图所示。 非互斥情况下出现的错误: 互斥情况下出现的情况。 参考文献。1、《计算机操作系统》教科书。 2、互联网。 闽江学院课程设计(**)任务书。 计算机科学院系软件教研室。 2024年 10 月 30日 闽江学院课程设计(**)任务书。 计算机科学院系软件教研室。 西安郵電大學。院系名称 计算机学院。专业名称 软件工程。班级 1104 学生姓名 赵大伟。学号 8位 04113124 指导教师 舒新峰。设计起止时间 2013.11.10 2013.11.20 1 通过观察 分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在posix 规范中... 课程设计。课程名称操作系统。题目名称多级文件系统 2 学生学院计算机学院 专业班级。学号。学生姓名。指导教师。年月日。目录。一 课程设计 6 二 开发工具及环境 6 三 设计内容 6 四 结构图 8 五 部分 9 六 运行截图 11 七 参考文献 15 八 心得体会 15 本课程设计要求设计一个模拟... 实验一进程管理。一 实验目的。1 开发一个函数,建立进程控制块和资源控制块结构,并实现相关数据结构的初始化。2 开发一系列操作,由进程调用这些操作,达到控制进程申请或释放各种资源的目的。通过实验理解进程的概念,进程的组成 pcb结构 进程的并发执行和操作系统进行进程管理的相关原语 主要是进程的创建 ...操作系统课程设计报告
操作系统课程设计报告
操作系统课程设计报告