一、实验目的
1.掌握基本的同步与互斥算法,理解P,V操作。
2.理解生产者消费者模型,了解其它典型的同步互斥模型,如哲学家就餐、读者-写者模型等。
3.学习使用Windows中基本的同步对象,掌握相关API的使用方法。
4.了解Windows中多线程的并发执行机制,实现进程的同步与互斥。

二、相关知识介绍
1.同步对象
同步对象是指Windows中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。
同步对象的使用步骤:
创建/初始化同步对象。
请求同步对象,进入临界区(互斥量上锁)。
释放同步对象(互斥量解锁)。
这些对象在一个线程中创建,在其他线程中都可以使用,实现同步与互斥。
2.相关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出现(即其值大于等于1)或超过规定的等待时间
格式
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——互斥量指针。
(7) InitializeCriticalSection
功能——初始化临界区对象
格式
VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
参数说明
lpCriticalSection——指向临界区对象的指针。
(8) EnterCriticalSection
功能——等待指定临界区对象的所有权
格式
VOID enterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
参数说明
lpCriticalSection——指向临界区对象的指针。
(9) LeaveCriticalSection
功能——释放指定临界区对象的所有权
格式
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
参数说明
lpCriticalSection——指向临界区对象的指针。

三、实验内容
1.以下程序是模拟售票功能,使用临界区对象,其中SellPro_1,SellPro_2两个函数分别对应两个售票进程,一次售出一张票。
(1)阅读程序,了解CRITICAL_SECTION的使用方法,

//模拟售票程序
#include <windows.h>
#include <iostream>
using namespace  std;DWORD WINAPI SellPro_1( LPVOID lpParameter);
DWORD WINAPI SellPro_2( LPVOID lpParameter );int tickets=100;
CRITICAL_SECTION  critical_sec; //定义关键区域
void main()
{HANDLE hThread1;HANDLE hThread2;InitializeCriticalSection(&critical_sec); //初始化关键区域hThread1=CreateThread(NULL,0,SellPro_1,NULL,0,NULL);hThread2=CreateThread(NULL,0,SellPro_2,NULL,0,NULL);  CloseHandle(hThread1);CloseHandle(hThread2);Sleep(4000);
}DWORD WINAPI SellPro_1( LPVOID lpParameter )
{   while(TRUE){   Sleep(1);EnterCriticalSection(&critical_sec); //进入关键代码区域         if(tickets>0){cout<<"thread1 sell  ticket : "<<--tickets<<endl;}elsebreak;LeaveCriticalSection(&critical_sec); //离开代码关键区域}  return 0;
}DWORD WINAPI SellPro_2( LPVOID lpParameter)
{   while(TRUE){   Sleep(1);EnterCriticalSection(&critical_sec); //进入关键代码区域         if(tickets>0){cout<<"thread2 sell  ticket : "<<--tickets<<endl;}elsebreak;LeaveCriticalSection(&critical_sec); //离开代码关键区域}    return 0;
}

(2)在分析程序运行结果的基础上,增加一个函数,模拟退票功能,并在主函数中加入适当的语句。

#include <windows.h>
#include <iostream>
using namespace  std;DWORD WINAPI SellPro_1( LPVOID lpParameter);
DWORD WINAPI SellPro_2( LPVOID lpParameter );
DWORD WINAPI SellPro_3( LPVOID lpParameter);
int tickets=100;
CRITICAL_SECTION  critical_sec; //定义关键区域
int main()
{HANDLE hThread1;HANDLE hThread2;HANDLE hThread3;InitializeCriticalSection(&critical_sec); //初始化关键区域hThread1=CreateThread(NULL,0,SellPro_1,NULL,0,NULL);hThread2=CreateThread(NULL,0,SellPro_2,NULL,0,NULL);
hThread3=CreateThread(NULL,0,SellPro_3,NULL,0,NULL);   CloseHandle(hThread1);CloseHandle(hThread2);
CloseHandle(hThread3);Sleep(4000);
}DWORD WINAPI SellPro_1( LPVOID lpParameter )
{   while(TRUE){   Sleep(1);EnterCriticalSection(&critical_sec); //进入关键代码区域         if(tickets>0){cout<<"thread1 sell  ticket : "<<--tickets<<endl;}elsebreak;LeaveCriticalSection(&critical_sec); //离开代码关键区域}  return 0;
}DWORD WINAPI SellPro_2( LPVOID lpParameter)
{   while(TRUE){   Sleep(1);EnterCriticalSection(&critical_sec); //进入关键代码区域         if(tickets>0){cout<<"thread2 sell  ticket : "<<--tickets<<endl;}elsebreak;LeaveCriticalSection(&critical_sec); //离开代码关键区域}    return 0;
}DWORD WINAPI SellPro_3( LPVOID lpParameter )
{   while(TRUE){   Sleep(1);EnterCriticalSection(&critical_sec); //进入关键代码区域         if(tickets>0){cout<<"thread3 return ticket : "<<++tickets<<endl;}elsebreak;LeaveCriticalSection(&critical_sec); //离开代码关键区域}  return 0;
}

实验四 进程同步与通信(一)进程同步与互斥1相关推荐

  1. 2020-10-29 实验四 进程同步与通信

    实验四 进程同步与通信 一.实验目的: 二.实验环境: 三.实验内容: 四.心得体会: 一.实验目的: 1. 掌握基本的同步与互斥算法,理解P,V操作. 2. 理解生产者消费者模型,了解其它典型的同步 ...

  2. 山东大学linux实验四CSDN,山东大学操作系统实验报告材料4进程同步实验

    <山东大学操作系统实验报告材料4进程同步实验>由会员分享,可在线阅读,更多相关<山东大学操作系统实验报告材料4进程同步实验(15页珍藏版)>请在人人文库网上搜索. 1.实用标准 ...

  3. 操作系统实验四 进程同步与互斥

    一.实验目的: 掌握基本的同步与互斥算法,理解P,V操作. 理解生产者消费者模型,了解其它典型的同步互斥模型,如哲学家就餐.读者-写者模型等. 了解LINUX中进程同步互斥的实现方法,掌握相关函数的使 ...

  4. 《操作系统第四版》(刘振鹏 王煜)(四)进程同步与通信

    操作系统(四) 四.进程同步与通信 4.1 进程间的相互作用 4.1.1进程间的联系 进程间的联系 资源共享关系 相互合作关系 临界资源 一种供多个进程互斥访问的资源 同一时刻只允许一个进程访问的资源 ...

  5. 操作系统学习(八)进程同步与通信

    目录 学习建议: 基本内容: 一.概述: 二.进程的顺序性: 三.进程的并发性: 四.与时间有关的错误: 五.临界区的概念: 六.进程的互斥: (一)PV操作: (二)临界区的管理: (三)用PV操作 ...

  6. 计算机操作系统进程同步实验报告,操作系统-进程管理与进程同步-实验报告

    进程管理与进程同步实验报告 实验一.进程管理与进程同步 一.实验目的 了解进程管理的实现方法,理解和掌握处理进程同步问题的方法. 二.实验内容 实现银行家算法.进程调度过程的模拟.读者-写者问题的写者 ...

  7. Python实现进程同步和通信

    Python实现进程同步和通信 如之前创建多进程的例子 # -*- coding:utf-8 -*- from multiprocessing import Process,Pool import o ...

  8. 【正点原子FPGA连载】第十四章 串口通信实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  9. 操作系统实验四——使用命名管道实现进程通信

    操作系统实验四--使用命名管道实现进程通信 一. 实验目的 (1)了解windows系统环境下的进程通讯机制. (2)熟悉Windows系统提供的进程通信API. 二. 实验准备 相关API函数介绍 ...

最新文章

  1. iOS进阶之架构设计MVVM模式实践(11)
  2. python流程控制-python之流程控制
  3. java-类的结构及使用
  4. C++ 创建对象时带括号和不带括号的区别
  5. 笔记-项目风险管理-转-从木桶效应谈对于安全管理的认识
  6. MATLAB调试caffe,在MATLAB下调试Caffe
  7. 一仅仅小蜜蜂(杭电2044)
  8. nginx学习文档之一 安装nginx-Windos下安装nginx
  9. 记录4 最近贺题时做的题 cf611e,cf873f,cf264d,cf1320d,cf1438c,hdu6833,hdu3602,cf1187g,cf1051e,cf925d,cf840c,etc
  10. Ubuntu升级glibc
  11. 计算机被管理员限制怎么解除,Win10系统管理员账户被禁用如何解除?
  12. MongoDB之学习【一】:初识Mongo,路远道长,绵绵不绝
  13. FFmpeg给mp4视频加上旋转90度的代码
  14. 导入FBX格式的模型至UE4
  15. 透明与不透明物体共存
  16. 数据分析之Matplotlib(二)折线图(plot)
  17. 台式计算机硬盘的安装位置,台式主机扩大存储,7步教你完美安装机械硬盘
  18. 使用ar_receipt_api_pub.apply失误
  19. 腾讯云Java工程师一面 + 被捞一面 + 二面面经(附答案)
  20. Makefile中的奇葩字符

热门文章

  1. 关于环境变量 C++ include搜索路径,lib库搜索路径
  2. Robotframework自动化测试框架
  3. 如何用BitLocker给移动硬盘,U盘加密
  4. BigDecimal如何保留小数位
  5. python如何读取excel表中的日期与时间
  6. Linux下的terminal多窗口开启及切换
  7. pandas将dataframe的所有数据列的名称转化为大写形式(all column labels in dataframe to uppercase)
  8. (一)SDRAM——SDRAM入门介绍
  9. 指纹识别实战——基于TensorFlow实现(文末送书)
  10. memcpy 函数详解