实验二 进程的同步和互斥的区别与互斥实验报告 一、...

实验二 进程(线程)的同步与互斥
一、实验目的
1. 掌握基本的同步与互斥算法,理解生产者消费者模型。
2. 学习使用Windows中基本的同步对象,掌握相关API的使用方法。
3. 了解Windows中多线程的并发执行机制,实现进程的同步与互斥。
二、实验内容
1. 实验内容
以生产者/消费者模型为依据,在Windows 环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。
Buffer(共享内存)
2. 实验要求
? 学习并理解生产者/消费者模型及其同步/互斥规则;
? 学习了解Windows同步对象及其特性;
? 熟悉实验环境,掌握相关API的使用方法;
? 设计程序,实现生产者/消费者进程(线程)的同步与互斥;
三、相关API的功能及使用
我们利用Windows SDK提供的API编程实现实验题目要求,而VC中包含有Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件――最常见的是Windows.h(特殊的API调用还需要包含其他头文件)。
下面给出的是本实验使用到的API的功能和使用方法简单介绍。
(1) CreateThread
? 功能――创建一个在调用进程的地址空间中执行的线程
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParamiter,
DWORD dwCreationFlags,
Lpdword lpThread
? 参数说明
lpThreadAttributes――指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。 dwStackSize――定义原始堆栈大小。
lpStartAddress――指向使用LPTHRAED_START_ROUTINE类型定义的函数。
lpParamiter――定义一个给进程传递参数的指针。
dwCreationFlags――定义控制线程创建的附加标志。
lpThread――保存线程标志符(32位)
(2) CreateMutex
? 功能――创建一个命名或匿名的互斥量对象
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName);
? 参数说明
lpMutexAttributes――必须取值NULL。
bInitialOwner――指示当前线程是否马上拥有该互斥量(即马上加锁)。
lpName――互斥量名称。
(3) CreateSemaphore
? 功能――创建一个命名或匿名的信号量对象
HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName );
? 参数说明
lpSemaphoreAttributes――必须取值NULL。
lInitialCount――信号量的初始值。该值大于等于0,但小于等于lMaximumCount指定的最大值。
lMaximumCount――信号量的最大值。
lpName――信号量名称。
(4) WaitForSingleObject
? 功能――使程序处于等待状态,直到信号量hHandle出现(即其值大于0)或超过规定的等待时间
DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
? 参数说明
hHandle――信号量指针。
dwMilliseconds――等待的最长时间(INFINITE为无限等待)。
(5) ReleaseSemaphore
? 功能――对指定信号量加上一个指定大小的量。成功执行则返回非0值
BOOL ReleaseSemaphore(HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lppreviousCount );
? 参数说明
hSemaphore――信号量指针。
lReleaseCount――信号量的增量。
lppreviousCount――保存信号量当前值。
(6) ReleaseMutex
? 功能――打开互斥锁,即把互斥量加1。成功调用则返回0
BOOL ReleaseMutex(HANDLE hMutex);
? 参数说明
hMutex――互斥量指针。
四、示例程序
#include &windows.h&
#include &iostream.h&
#include &stdio.h&
#include &math.h&
#include &stdlib.h&
#include &time.h&
#define MAX_THREAD_NUM 64
//最大线程数
#define INTE_PER_SEC 1000
//延迟时间的毫秒值
const int SIZE_OF_BUFFER = 10;
int ProductID = 0;
int ConsumeID = 0;
int in = 0;
int out = 0;
//缓冲区长度 //产品号
//将被消耗的产品号
//产品进缓冲区时的缓冲区下标
//产品出缓冲区时的缓冲区下标
bool running=
//判断程序能否继续执行的逻辑值
int g_buffer[SIZE_OF_BUFFER];
//缓冲区是个循环队列
HANDLE g_hM
//公有信号量,用于线程间的互斥
//生产者的私有信号量,当缓冲区满时迫使生产者等待
//消费者的私有信号量,当缓冲区空时迫使消费者等待
HANDLE g_hFullS
//定义一个结构体用于存储线程的信息
struct ThreadInfo HANDLE g_hEmptyS
void Producer(void *p)
Sleep(m_delay);
//延迟等待 //生产一个产品 cout&&&生产者线程 &&&m_serial&&& 生产 &&&++ProductID &&& 号产品成功.& cout&&&生产者线程 &&&m_serial&&& 请求将产品 &&&ProductID&&& 投入缓冲//把新生产的产品放入缓冲区
g_buffer[in] = ProductID; in = (in+1)%SIZE_OF_BUFFER;
Sleep(m_persist); //操作等待 cout&&&生产者线程 &&&m_serial&&& 将产品 &&&ProductID&&& 投入缓冲区中成 while(running) {
//P操作 cout&&&生产者线程 &&&m_serial&&& 请求生产.&&& WaitForSingleObject(g_hEmptySemaphore,INFINITE);
cout&&&生产者线程 &&&m_serial&&& 请求独占缓冲区.&&& WaitForSingleObject(g_hMutex,INFINITE);
//从参数中获得信息 m_serial=((ThreadInfo*)(p))-& m_delay=(DWORD)(((ThreadInfo*)(p))-&delay *INTE_PER_SEC); m_persist=(DWORD)(((ThreadInfo*)(p))-&persist *INTE_PER_SEC); //定义变量用于存储当前线程的信息 DWORD m_ DWORD m_ int m_
//线程类别(生产者或消费者)
//等待时间 //操作时间 && 区.&&& 功.&&&君,已阅读到文档的结尾了呢~~
实验一 进程同步与互斥
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
实验一 进程同步与互斥
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口南昌大学实验报告;---(2)编程模拟进程间的同步和互斥;一、实验目的;通过实验加强对进程同步和互斥的理解,并掌握进程(;二、实验内容;1.以下为Linux系统下参考程序,请编译、运行;#include&stdio.h&;#include&stdlib.h&;#include&unistd.h&;#include&t
南昌大学实验报告
---(2)编程模拟进程间的同步和互斥
一、实验目的
通过实验加强对进程同步和互斥的理解,并掌握进程(线程)的创建和调用方法。学会使用信号量解决资源共享问题。学生可以自己选择在Windows或Linux系统下编写。
二、实验内容
1.以下为Linux系统下参考程序,请编译、运行并观察程序的输出,并分析实验结果,写出实验报告。
#include&stdio.h&
#include&stdlib.h&
#include&unistd.h&
#include&time.h&
#include&sys/types.h&
#include&sys/wait.h&
#include&linux/sem.h&
#define NUM_PROCS 5
#define SEM_ID
#define FILE_NAME &/tmp/sem_aaa&
#define DELAY
void update_file(int sem_set_id, char *file_path, int number){
struct sembuf sem_ FILE *
//建立一个文件指针 //等待信号量的数值变为非负数,此处设为负值,相当于对信号量进行P操作 sem_op.sem_num=0; sem_op.sem_op=-1; sem_op.sem_flg=0;
semop(sem_set_id,&sem_op,1);/*操作一组信号sem_set_id是进程的标识符,sem_op
是结构指针。sem_op:如果其值为正数,该值会
加到现有的信号内含值中。通常用于释放所控资
源的使用权;如果sem_op的值为负数,而其绝
对值又大于信号的现值,操作将会阻塞,直到信
号值大于或等于sem_op的绝对值。通常用于获
取资源的使用权;如果sem_op的值为0,则操作
将暂时阻塞,直到信号的值变为0。*/
//写文件,写入的数值是当前进程的进程号
file=fopen(file_path,&w&);
//写文件,若成功者返回文件起始地址;否则0 if(file){//临界区
fprintf(file,&进程%d\n&,number);
//将当前的进程号写入*file处
fclose(file);
//关闭文件 } //发送信号,把信号量的数值加1,此处相当于对信号量进行V操作 sem_op.sem_num=0; sem_op.sem_op=1;
//信号量加1 sem_op.sem_flg=0; semop(sem_set_id,&sem_op,1);
//子进程写文件
void do_child_loop(int sem_set_id,char *file_name){
pid_t pid=getpid();
//取得目前进程的识别码,返回当前的进程的标识符 int i,j; for(i=0;i&3;i++){
} update_file(sem_set_id,file_name,pid); for(j=0;j&4000000;j++);
int main(int argc,char **argv)
int sem_set_
//信号量集的ID union semun sem_
//信号量的数值,用于semctl() int child_ // 建立信号量集,ID是250,其中只有一个信号量 sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600); if(sem_set_id==-1){
//如果调用失败,输出错误类型,强制退出程序
perror(&main: semget&);
} exit(1); //把第一个信号量的数值设置为1 sem_val.val=1; rc=semctl(sem_set_id,0,SETVAL,sem_val); if(rc==-1)
//测试是否成功调用semclt()函数 {
perror(&main:semctl&); exit(1); } //建立一些子进程,使它们可以同时以竞争的方式访问信号量 for(i=0;i&NUM_PROCS;i++){ child_pid=fork();
//创建子进程。如果成功子进程返回0,父进程返回子进程
//ID。否则返回-1
} case -1:
perror(&fork&); case 0:
do_child_loop(sem_set_id,FILE_NAME);
//子进程写文件
//正常退出 default:
//父进程接着运行
} //等待子进程结束 for(i=0;i&NUM_PROCS;i++){
int child_ wait(&child_status);
//成功就返回子进程识别码PID } printf(&main:we're done\n&); fflush(stdout);
//刷新标准输出缓冲区的输出缓冲区里的东西,打印到标准输出
//设备上 return 0;
三、实验要求
1、 linux操作系统
2、 Windows操作系统
四、主要实验步骤
linux操作系统下的操作步骤:
semaphore.c
(编辑程序)
gcc Co semaphore
semaphore.c (编译、链接程序)
./semaphore(执行程序)
五、实验数据及处理结果
六、实验体会或对改进实验的建议
体验了在linux环境下编写C语言程序的感觉,相当好。Linux是一个很强大的系统。
七、参考资料
《ubuntu权威指南》
《计算机操作系统》
包含各类专业文献、应用写作文书、行业资料、幼儿教育、小学教育、专业论文、文学作品欣赏、生活休闲娱乐、高等教育、76实验2-编程模拟进程间的同步和互斥等内容。 
 实验1编程实现进程(线程)同步和互斥_计算机软件及应用...h_mutex2 实现对 readcount 操作的互斥,h_mutex3...(&\n\n&); //创建模拟过程中必要的信号量 h_...  实验二进程同步实验_计算机软件及应用_IT/计算机_...模拟生产者和消费者,实现进程(线程)的同步与互斥。...2. 创建或打开信号量集 semget()系统调用创建一个...  2.实验:进程的同步和互斥 4页 免费 计算机软件技术基础实验一... 暂无评价 11页 5财富值 实验2-编程模拟进程间的同... 4页 5财富值 操作系统实验报告――...  操作系统实验-进程同步与互斥_工学_高等教育_教育专区...输入到变量 OutPipe 中,n=1,2; 将 OutPipe 中...1编程实现进程(线程)同步... 7页 1下载券 进程互...  模拟多进程之间的同步与互斥_电脑基础知识_IT/计算机...操作系统实验报告――进... 12页 1下载券 操作系统...生产者消费者问题源代码 2页 免费 操作系统编程进程...  学习 windows 平台下常用的同步 方式, 并分析 2 个实验程序 (利用信号量实现两个进程间的同步和利用互斥量实现读者写者 问题) ,观察程序的运行情况并分析执行...  操作系统进程同步互斥实... 7页 2下载券 操作系统实验报告――进... 12页 ...程序设计概述:用 C#的 windows 应用程序编写程序,其中利用控件 datagridview 进行...  10)界面如下 6 南昌大学实验报告 --- ( 2 )编程模拟进程间的同步和互斥 学生姓名: 王桥 学号:
实验日期: 专业班级: 计科 123 实验成绩: 实验...  四、主要实验步骤 五、实验数据及处理结果 六、实验体会或对改进实验的建议 七、参考资料 南昌大学实验报告 --- ( 2 )编程模拟进程间的同步和互斥 学生姓名: ...课 程 实 验 报 告
课程名称:
专业班级: 计算机科学与技术 xxx
指导教师:
报告日期:
计算机科学与技术学院
实验一 进(线)程同步与通信.................................................................................. 1
1实验目的与内容......................................................................................................... 1
1.1实验目的.................................................................................................. 1
1.2实验内容.................................................................................................. 1
2. 实验过程步骤........................................................................................................... 1
1、步骤及流程.............................................................................................. 1
2、实验测试与结果...................................................................................... 2
3、实验总结及故障...................................................................................................... 3
1、故障.......................................................................................................... 3
2、实验总结.................................................................................................. 3
实验二 Linux进程及同步 ........................................................................................... 4
1实验目的与内容......................................................................................... 4
1.1实验目的.................................................................................................. 4
1.2实验内容.................................................................................................. 4
2. 实验过程步骤........................................................................................................... 4
1、步骤及流程.............................................................................................. 4
2、实验测试与结果...................................................................................... 6
3、实验总结及故障...................................................................................................... 7
1、故障.......................................................................................................... 7
2、实验总结.................................................................................................. 8
实验三 Linux文件目录操作 ....................................................................................... 9
1实验目的与内容......................................................................................................... 9
1.1实验目的.................................................................................................. 9
1.2实验内容.................................................................................................. 9
2. 实验过程步骤........................................................................................................... 9
1、步骤及流程.............................................................................................. 9
2、实验测试与结果.................................................................................... 11
3、实验总结................................................................................................................ 12
实验一 进(线)程同步与通信
1实验目的与内容
1.1实验目的
1、掌握Linux系统用户界面中键盘命令的使用。
2、学会一种Linux下的编程环境。
3、掌握Linux下进(线)程的概念。
4、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。
1.2实验内容
1、两个线程,共享公共变量a
2、线程1负责计算(+1)
3、线程2负责打印
2. 实验过程步骤
1、步骤及流程
算法步骤:
(1)首先初始化信号集,给0信号灯赋值1,给1信号灯赋值0。
信号集的初始化需要调用semget(),信号量的操作使用到semop(),在p,v操作函数里使用。而定义的信号灯赋值,使用到了semctl()函数,在本函数中,为0信号灯赋值1,为1信号灯赋值0。
(2)接着创建两个线程,一个线程进行计算,一个线程进行打印。在计算线程中,首先对0号信号灯进行p操作,开始时,可以直接计算,之后,每计算一次都要等待打印线程进行v操作,唤醒计算线程进入共享缓冲区。计算线程结束后,对1号信号灯进行v操作,使得申请进入共享缓冲区的打印线程能够进入。故在打印线程是首先对1号信号灯进行p操作,结束后,对0号信号灯进行v操作,使得能够继续运算。当运算结果达到15时,运算结束,打印完15后,两个线程结束。
在这里使用到了p,v函数以及创建线程函数pthread_create()。
(3)删除两个信号量
删除两个信号量同样使用到了semctl()函数,改变其中一个参数即可。 简单的流程图如下所示:
图1 流程图
2、实验测试与结果
测试结果:
说明:如图所示,计算和打印交替执行,公共变量的初始值为0,对0号信号灯p操作,申请进入成功,变量加1,显示“in subp1,data is inputing:”,对1信号灯进行v操作,打印程序开始执行,打印出“in subp2:data=”,一共计算打印15次完毕,如图2}

我要回帖

更多关于 同步和互斥的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信