摘要:

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. WinSDK(菜单笔记)

  2. MSG结构体和WndProc窗口过程详解

    MSG结构体和WndProc窗口过程对于Windows编程非常重要,如果不了解它们,可以说就没有学会Windows编程. MSG结构体 MSG 结构体用来表示一条消息,各个字段的含义如下: typed ...

  3. PTA第二个编程题总结

    7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用小写英文字 ...

  4. 本地设置VirtualBox虚拟机

    主要是涉及到网卡设置,允许本地ping虚拟机

  5. mysql两条sql合并查询总数

    select IFNULL(c.nodeCount,0) + IFNULL(c.phyCount,0) as totalCount from ( select count(*) nodeCount, ...

  6. ili9325--LCD寄存器配置研究

    2011-06-22 22:18:12 自己根据ili9325的规格书编写驱动.发现LCD屏没显示.于是怀疑是某些寄存器设置错误.要调试的话最好还是先熟悉寄存器的作用,调试的时候只要看到现象就能分析了 ...

  7. 51Nod 1085 背包问题 (01背包)

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数).求背包能够容纳的最大价值. 收起   输入 第1行,2个 ...

  8. MySQL更新命令_UPDATE

    创建测试表 mysql> CREATE TABLE `product` ( -> `proID` ) NOT NULL AUTO_INCREMENT COMMENT '商品表主键', -& ...

  9. Python while 循环

     while循环的使用 count = 0 while True: print("conunt:",count) conunt = conunt +1 注:while:作为循环命令 ...

  10. 网站基础html javascript jquery

    第二章HTML HBuilder的使用 边改边看模式 chrome浏览器看. HTML的基本格式 超文本标记语言 HyperText Markup Language HyperText 超文本 Mar ...