摘要:

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中线程的创建和同步控制的更多相关文章

  1. java中线程池创建的几种方式

    java中创建线程池的方式一般有两种: 通过Executors工厂方法创建 通过new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize ...

  2. Windows中使用QEMU创建树莓派虚拟机

    环境: windows 10 2018-04-18-raspbian-stretch.img 一.下载QEMU 根据你的系统情况,下载相应的版本,并安装完成 https://www.qemu.org/ ...

  3. 操作系统 - unix和windows下进程异同

    在UNIX系统中,只有一个系统调用可以用来创建新进程:fork.这个系统调用会创建一个与调用进程相同的副本.在调用了fork之后,这两个进程(父进程和子进程)拥有相同的存储映像.同样的环境字符串和同样 ...

  4. Java并发编程:线程的创建

    Java并发编程:线程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...

  5. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  6. Windows中的Work线程和GUI线程

    Windows线程分为两种:Worker线程.GUI线程 worker线程:是指完全不牵扯到图形用户界面(GUI),纯粹做运算的线程. GUI线程:负责建造窗口以及处理消息循环(拥有消息队列).任何一 ...

  7. windows中的进程和线程

    今天咱们就聊聊windows中的进程和线程 2016-09-30 在讨论windows下的进程和线程时,我们先回顾下通用操作系统的进程和线程.之所以称之为通用是因为一贯的本科或者其他教材都是这么说的: ...

  8. 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁

    并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...

  9. ucore操作系统学习(四) ucore lab4内核线程管理

    1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...

随机推荐

  1. easy ui datatimebox databox 当前时间

    databox  当前日期: class="easyui-datebox" var curr_time = new Date(); var strDate = curr_time. ...

  2. centos7.5 修改网卡名称

    1.修改网卡配置文件中名称信息 vim /etc/sysconfig/network-scripts/ifcfg-ens33 将其中的名称为ens33的改为eth0 ,并将uuid删除以便后面克隆 2 ...

  3. 像素与DPI之间的关系

    先说像素.像素是电子图像组成的基本单位,将图像放大数倍,会发现图像是由一个个“小色块”紧密排列组成的,每一个“小色块”就是一个像素点. 也就是说,每个图像都是由n多个像素点组成. 再说分辨率.所谓分辨 ...

  4. dotnet Core 异步任务

    使用线程池中线程的任务启动方式 线程池提供了一个后台线程的池,独自管理线程,按需增加或减少线程池中的线程数.线程池中的线程用于执行一些动作后仍然返回线程池中. using System; using ...

  5. P1605 迷宫

    P1605 迷宫 这是一道毒瘤题... 这是一道广搜题 bfs ... 代码: #include<cstdio> #include<iostream> #include< ...

  6. Spring笔记 #02# 利用切面和注解校验方法参数

    例子还是之前的例子.仍然是对mage进行法术攻击时的咒语进行校验,不过略微提高了扩展性. 应用示例 1.在.properties文件中定义参数格式(正则): sp1=^\\D*hello\\D*$ s ...

  7. angular7 Rxjs 异步请求

    Promise 和 RxJS 处理异步对比 Promise 处理异步: let promise = new Promise(resolve => { setTimeout(() => { ...

  8. VC++ 异常处理 __try __except的用法

    转载:https://blog.csdn.net/jiaxiaokai/article/details/50983867 __try __except的用法: __try __except是windo ...

  9. jQuery validator plugin之概要

    jQuery validator 主页 github地址 demo学习 效果: Validate forms like you've never validated before! 自定义Valida ...

  10. POJ1141 Brackets Sequence---区间DP+输出路径

    题目意思就是输入一串括号,让你找到最小的补偿数目使括号串合法,并且输出补全后的串. 基本是区间DP的模板题,该题特别让你输出补全后的答案.这和区间dp的反向思路很像,就是把一个大的区间划分为多个互不干 ...