操作系统の实验四 windows中线程的创建和同步控制
摘要:
1、创建信号量
HANDLE CreateSemaphore(
LPSECURITY_ATTIBUTES lpSemaphoreAttributes,
LONG lInitialCount; //信号量初始值
LONG lMaximumCount, //信号量最大值
LPCTSTR lpName);
应用举例:
Empty=CreateSemaphore(NULL,10,10,NULL); //Semaphore empty=10;
2、P操作
DWORD WaitForSingleObject(
HANDLE hHandle, //等待对象句柄
DWORD dwMilliseconds); //指定以毫秒为单位的超时间隔。如果超时,即使对象的状态是非信号且没有完成,该函数也返回。如果其值为0,函数测试对象的状态并立刻返回,如果其值是INFINITE,函数从不超时。
其中hHandle。
应用举例:
WaitForSingleObject(empty,INFINITE); // P(empty);
3、V操作
1)BOOL ReleaseSemaphore(
HANDLE hSemaphore, //信号量句柄
LONG lReleaseCount, //信号量计数增加值,该值不可以为负或0
LPLONG lpPreviousCount); //返回信号量原来的值。
应用举例:ReleaseSemaphore(full,1,&b); //V(full);
2)BOOL ReleaseMutex(HANDLE Mutex); //V(mutex);
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include<iostream>
using namespace std; DWORD WINAPI Threadread(LPVOID);
DWORD WINAPI Threadwrite(LPVOID);
int a[]={-,-,-,-,-,-,-,-,-,-};//定义一个数据缓存a 定义一个数据缓存 HANDLE empty;
HANDLE full;
HANDLE mutex; int main()
{ DWORD threadId1;
DWORD threadId2; empty = CreateSemaphore(NULL,,,NULL); //初始化empty=10;
full = CreateSemaphore(NULL,,,NULL); //初始化full=0;
mutex = CreateMutex(NULL,FALSE,NULL); //初始化mutex=1; HANDLE read = CreateThread(NULL,,Threadread,(LPVOID),,&threadId1);
HANDLE write = CreateThread(NULL,,Threadwrite,(LPVOID),,&threadId2); Sleep();
if(write)
{
cout<<"write over"<<endl;
CloseHandle(write);
}
if(read)
{
cout<<"read over"<<endl;
CloseHandle(read);
}
return EXIT_SUCCESS;
} //定义读操作
DWORD WINAPI Threadread(LPVOID x)
{
int j;
for(int i = ; i < ; i++)
{
for(j = ; j < ; j++)
{
WaitForSingleObject(full, INFINITE); // P(full);
WaitForSingleObject(mutex, INFINITE); // P(mutex);
cout<<"read"<<i<<":"<<"a["<<j<<"]:"<<a[j]<<endl;
ReleaseMutex(mutex); //V(mutex);
ReleaseSemaphore(empty,,NULL); //V(empty);
}
Sleep();
}
return ;
} //定义写操作
DWORD WINAPI Threadwrite(LPVOID x)
{
int j;
for(int i = ; i < ; i++)
{
for(j = ; j < ; j++)
{
WaitForSingleObject(empty, INFINITE); // P(empty);
WaitForSingleObject(mutex, INFINITE); // P(mutex);
a[j] = *i+j;
cout<<" write"<<i<<":"<<"a["<<j<<"]:"<<a[j]<<endl;
ReleaseMutex(mutex); //V(mutex);
ReleaseSemaphore(full,,NULL); //V(full);
}
Sleep();
}
return ;
}
操作系统の实验四 windows中线程的创建和同步控制的更多相关文章
- java中线程池创建的几种方式
java中创建线程池的方式一般有两种: 通过Executors工厂方法创建 通过new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize ...
- Windows中使用QEMU创建树莓派虚拟机
环境: windows 10 2018-04-18-raspbian-stretch.img 一.下载QEMU 根据你的系统情况,下载相应的版本,并安装完成 https://www.qemu.org/ ...
- 操作系统 - unix和windows下进程异同
在UNIX系统中,只有一个系统调用可以用来创建新进程:fork.这个系统调用会创建一个与调用进程相同的副本.在调用了fork之后,这两个进程(父进程和子进程)拥有相同的存储映像.同样的环境字符串和同样 ...
- Java并发编程:线程的创建
Java并发编程:线程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- Windows中的Work线程和GUI线程
Windows线程分为两种:Worker线程.GUI线程 worker线程:是指完全不牵扯到图形用户界面(GUI),纯粹做运算的线程. GUI线程:负责建造窗口以及处理消息循环(拥有消息队列).任何一 ...
- windows中的进程和线程
今天咱们就聊聊windows中的进程和线程 2016-09-30 在讨论windows下的进程和线程时,我们先回顾下通用操作系统的进程和线程.之所以称之为通用是因为一贯的本科或者其他教材都是这么说的: ...
- 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁
并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...
- ucore操作系统学习(四) ucore lab4内核线程管理
1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...
随机推荐
- openGL学习----相机
0.参考:https://learnopengl-cn.github.io/01%20Getting%20started/09%20Camera/ 0.0其实相机就是搞清楚cameraPos,came ...
- java 写一个类,实现对象数的计算
但是在面向对象设计之前,广泛采用的是面向过程,面向过程只是针对于自己来解决问题.面向过程的操作是以程序的基本功能实现为主,实现之后就完成了,也不考虑修改的可能性,面向对象,更多的是要进行子模块化的设计 ...
- opencv3.0之后IPLimage转换成MAT的问题
转自http://www.cnblogs.com/edver/p/5187190.html IplImage * ipl = ...; cv::Mat m = cv::cvarrToMat(ipl); ...
- 利用jQuery实现用户名片小动画
我爱撸码,撸码使我感到快乐!大家好,我是Counter.下面给大家介绍利用jQuery实现的小动画,非常的简便,如果有原生js操作的话,那么就不止这么多行了.至于CSS,个人觉得,这边CSS布局也蛮重 ...
- Java基础学习-常用的dos命令
打开控制台(win+R,然后cmd回车) 常用命令: d:回车 盘符切换 dir(directory):列出当前目录下的文件以及文件夹 cd( ...
- [译]课程 1: 使用 Quartz
译者注: 原文在这 Lesson 1: Using Quartz 在你使用调度器之前, 你需要先实例化(能猜到是谁么?). 要实例化, 请使用 ISchedulerFactory 的实现. 译者注: ...
- centos6.5下安装tomcat
linux在安装tomcat之前必须已安装jdk 已下载好tomcat 拖到centos系统的桌面 现在在桌面目录下 mv apache-tomcat-8.5.39.tar.gz /usr/local ...
- Python:将数组中的元素导出到变量中 (unpacking)
问题 你需要将数组(list)或元组(tuple)中的元素导出到N个变量中. 解决方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要和序列中的结构 ...
- From传值
第一个Form,Form1: string value = string.Empty; using (Form2 frm = new Form2()) { if (frm.ShowDialog() = ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...