摘要:

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. git之摘抄

    vn中央集权, 统一服务器, 权限安全管理 git 分布式,代码仓库历史本地有,不受约束, 可以随意开分支.

  2. web前端学习历程--排序

    一.js排序方法 1.按字母顺序排列: arr.sort() 2.按数值从小到大: function sortNumber(a,b)//排序函数 { return a - b } var arr = ...

  3. Android-Gradle(二)

    理解Gradle脚本 当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具.当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件 ...

  4. firefox 实现web交互机器人

    现在仅有火狐浏览器可以这样操作 -- Filefox 下面是项目目录 -- 前端页面 -- html <!DOCTYPE html> <html lang="en" ...

  5. 因微信SSJD分享接口升级,分享变化

    4月25日发版发现的微信分享问题,已确认是腾讯微信开发团队更新的分享的策略,而我们未能收到通知依然沿用老代码造成的.目前已经解决,解决方案如下: 微信分享的shareUrl域名必须与当前环境的安全域名 ...

  6. MySQL插入更新_ON DUPLICATE KEY UPDATE

    前提:操作的表具有主键或唯一索引 INSERT INTO:表中不存在对应的记录,则插入:若存在对应的记录,则报错: INSERT INTO IGNORE:表中不存在对应的记录,则插入:若存在对应的记录 ...

  7. angular7 Rxjs 异步请求

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

  8. 剑指offer(2)替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 题目分析 我们如果要替换空格,两步 ...

  9. 比原链Bytom错误码一览

    0XX API错误 BTM000", "Bytom API Error" 非比原标准错误 BTM001", "Request timed out&qu ...

  10. HTML基础【1】:认识 HTML

    什么是HTML ​ HTML其实是 HyperText Markup Language 的缩写,超文本标记语言 HTML的作用 1.首先利用记事本保存了一个标题和两段描述, 然后修改纯文本文件的扩展名 ...