#include <STDIO.H>
#include <windows.h>
//#include "stdafx.h"
#include <process.h> // _beginthread && _endthread
//#include "BaseOperation.h"
#define N 10 typedef int semaphore; /* 信号量是一种特殊的整型变量 */ semaphore mutex=; /* 互斥访问 */
semaphore empty=N; /* 记录缓冲池中空的缓冲区数 */
semaphore full=; /* 记录缓冲池中满的缓冲区数*/ semaphore buf[N]; /* 有N个缓冲区数的缓冲池buf[N],并实现循环缓冲队列 */
semaphore in=, out=; void p(semaphore *x) /* p操作 */
{
*x=(*x)-;
} void v(semaphore *y) /* v操作 */
{
*y=(*y)+;
} void produce_item(int *item_ptr)
{
/*printf("produce an item\n");*/
*item_ptr='F'; /* 'F' is "Full满" */
} void enter_item(int x)
{
in=(out+)%N;
buf[in]=x;
printf("enter_item %c to buf[%d]\n", buf[in], in);
} void remove_item(int *yy)
{
out=(out+)%N;
printf("remove_item %c from buf[%d]", buf[out], out);
*yy=buf[out];
buf[out]='E'; /* 'E' is "Empty空" */
printf(" so the buf[%d] changed to empty--%c\n", out, buf[out]);
}
void consume_item(int y)
{
printf("cosume the item :the screem print %c\n", y);
} void producer(void);
void consumer(void);
int item;
DWORD WINAPI ThreadProc1( LPVOID lpParam )
{ int i=,j=;
while()
{
produce_item(&item); //延时
for(i=;i<;i++)
{
;
}
}
}
/* 生产者 */ DWORD WINAPI ThreadProc2( LPVOID lpParam )
{ int i=,j=;
while()
{
consumer(); //延时
for(i=;i<;i++)
{
;
}
}
} void producer(void)
{ while(){
//_beginthread(produce_item(&item),0,NULL);
CreateThread(
NULL, // default security attributes
, // use default stack size
ThreadProc1, // thread function
NULL, // argument to thread function
, // use default creation flags
NULL); // returns the thread identifier
p(&empty); /* 递减空缓冲区数 */
p(&mutex); /* 进入临界区 */
enter_item(item); /* 将一个新的数据项放入缓冲池 */
v(&mutex); /* 离开临界区 */
v(&full); /* 递增满缓冲区数 */
if(full==N) /* 若缓冲池满的话,唤醒消费者进程 */
CreateThread(
NULL, // default security attributes
, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
, // use default creation flags
NULL); // returns the thread identifier
}
} /* 消费者 */
void consumer(void)
{
int get_item; while(){
p(&full); /* 递减满缓冲区数 */
p(&mutex); /* 进入临界区 */
remove_item(&get_item); /* 从缓冲池中取走一个数据项 */
v(&mutex); /* 离开临界区 */
v(&empty); /* 递增空缓冲区数 */
consume_item(get_item); /* 对数据项进行操作(消费)*/
if(empty==N) /* 若缓冲池全空的话,唤生产者进程 */
producer();
}
} /* 调用生产者-消费者进程实现进程间同步 */
main()
{
producer(); return ;
}
 #include <STDIO.H>
#include <windows.h>
//#include "stdafx.h"
#include <process.h> // _beginthread && _endthread
//#include "BaseOperation.h"
#define N 10 typedef int semaphore; /* 信号量是一种特殊的整型变量 */ semaphore mutex=; /* 互斥访问 */
semaphore empty=N; /* 记录缓冲池中空的缓冲区数 */
semaphore full=; /* 记录缓冲池中满的缓冲区数*/ semaphore buf[N]; /* 有N个缓冲区数的缓冲池buf[N],并实现循环缓冲队列 */
semaphore in=, out=; void p(semaphore *x) /* p操作 */
{
*x=(*x)-;
} void v(semaphore *y) /* v操作 */
{
*y=(*y)+;
} void produce_item(int *item_ptr)
{
/*printf("produce an item\n");*/
*item_ptr='F'; /* 'F' is "Full满" */
} void enter_item(int x)
{
in=(out+)%N;
buf[in]=x;
printf("enter_item %c to buf[%d]\n", buf[in], in);
} void remove_item(int *yy)
{
out=(out+)%N;
printf("remove_item %c from buf[%d]", buf[out], out);
*yy=buf[out];
buf[out]='E'; /* 'E' is "Empty空" */
printf(" so the buf[%d] changed to empty--%c\n", out, buf[out]);
}
void consume_item(int y)
{
printf("cosume the item :the screem print %c\n", y);
} void producer(void);
void consumer(void);
int item;
DWORD WINAPI ThreadProc1( LPVOID lpParam )
{ int i=,j=;
while()
{
produce_item(&item); //延时
Sleep();
}
}
/* 生产者 */ DWORD WINAPI ThreadProc2( LPVOID lpParam )
{ int i=,j=;
while()
{
consumer(); //延时
Sleep();
}
} void producer(void)
{ while(){
//_beginthread(produce_item(&item),0,NULL);
CreateThread(
NULL, // default security attributes
, // use default stack size
ThreadProc1, // thread function
NULL, // argument to thread function
, // use default creation flags
NULL); // returns the thread identifier
p(&empty); /* 递减空缓冲区数 */
p(&mutex); /* 进入临界区 */
enter_item(item); /* 将一个新的数据项放入缓冲池 */
v(&mutex); /* 离开临界区 */
v(&full); /* 递增满缓冲区数 */
if(full==N) /* 若缓冲池满的话,唤醒消费者进程 */
CreateThread(
NULL, // default security attributes
, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
, // use default creation flags
NULL); // returns the thread identifier
}
} /* 消费者 */
void consumer(void)
{
int get_item; while(){
p(&full); /* 递减满缓冲区数 */
p(&mutex); /* 进入临界区 */
remove_item(&get_item); /* 从缓冲池中取走一个数据项 */
v(&mutex); /* 离开临界区 */
v(&empty); /* 递增空缓冲区数 */
consume_item(get_item); /* 对数据项进行操作(消费)*/
if(empty==N) /* 若缓冲池全空的话,唤生产者进程 */
producer();
}
} /* 调用生产者-消费者进程实现进程间同步 */
main()
{
producer(); return ;
}

多线程PV的更多相关文章

  1. 多线程同步内功心法——PV操作上(未完待续。。。)

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  2. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步

    Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述     PV操作是对信号量进行的操作.     进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...

  3. 多线程面试题系列(12):多线程同步内功心法——PV操作上

    上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点.本文将会先简要介绍下P ...

  4. Java—多线程实现PV效果

    前言 还记得今年参加自学操作系统考试,最难分析的就是PV这部分,然而伟大的米老师却用一个放东西吃东西的小例子,把PV讲的栩栩如生,言简意赅.学J2SE时学到了线程部分,里面提到了线程同步,死锁问题等等 ...

  5. windows多线程(九) PV原语分析同步问题

    一.PV原语介绍 PV原语通过操作信号量来处理进程间的同步与互斥的问题.其核心就是一段不可分割不可中断的程序. 信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新 ...

  6. 转---秒杀多线程第十二篇 多线程同步内功心法——PV操作上 (续)

    PV操作的核心就是 PV操作可以同时起到同步与互斥的作用. 1.同步就是通过P操作获取信号量,V操作释放信号量来进行. 2.互斥其实就是,同时操作P操作,结束后进行V操作即可做到. Java上实现PV ...

  7. [多线程同步练习]PV操作

    看一个较为复杂的生产者-消费者问题: 问题描述 桌子上有一只盘子,每次只能向其中放入一个水果.爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果.只有盘子为空时 ...

  8. iOS GCD NSOperation NSThread等多线程各种举例详解(拷贝)

    2年多的iOS之路匆匆而过,期间也拜读来不少大神的博客,近来突然为自己一直做伸手党感到羞耻,是时候回馈社会.回想当年自己还是小白的时候,照着一些iOS多线程教程学,也只是照抄,只知其然.不知其所以然. ...

  9. 【五子棋AI循序渐进】——多线程搜索

    关于多线程搜索,有很多方法来实现,很多文章推荐基于MTD(F)的方式.好处不言而喻,不过我的程序中采用的是基于PVS的多线程搜索.实现起来主要是这几个方面问题需要解决: 1.置换表的互斥访问. 2.局 ...

随机推荐

  1. Rails中在model中获取当前登录用户

    应用场景:更新系统操作记录时,记录操作人即当前登录用户 方法一:在线程中添加一个变量 class UsersController < ApplicationController before_a ...

  2. java int 与 Integer之间的区别

    int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...

  3. 20155235 2016-2017-2 《Java程序设计》第十周学习总结

    20155235 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 计算机网络 计算机网络由若干结点和连接这些结点的链路组成.网络中的结点可以是计算机.集线器. ...

  4. 20155318 2016-2017-2 《Java程序设计》第二周学习总结

    20155318 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 Java编程风格 基本语法与C相似:调用main函数写public static void ...

  5. 思维水题 poj1852

    题目链接:http://poj.org/problem?id=1852 题意:木板长为n,    蚂蚁数量为k,    后面k个数,依次代表蚂蚁的位置,  当蚂蚁到达边界的时候会立马掉下,当两个蚂蚁相 ...

  6. [agc006D]Median Pyramid Hard-[二分+乱搞]

    Description 题目大意:给你一个长度为n*2-1的排列,将除了该序列头尾的两个数外的其他数(设为i)变为原序列i-1,i,i+1下标数的中位数.求最后的数是什么.例子如下: Solution ...

  7. day 3 局部变量 全局变量

    1.局部变量 2.全局变量(死歌的大招)函数前面声明的都是全局变量 3.全局变量和局部变量的区别 1)老方法 def get_temper(): temper = 33 return temper d ...

  8. loadrunner之做压力测试要做的准备

    前提B/S架构 1.要有个备库和主库保存一致 到时候做压力测试的时候,要断开主库连接到备库.进行测试.以免主库出现垃圾数据.2.节点 判断单节点能承受多大的压力,如200万的用户账号,10万的在线用户 ...

  9. 使用idea写ssm的时候提示源文件夹中的文件找不到

    <context:property-placeholder location="classpath:db.properties"/>这一行idea提示找不到db.pro ...

  10. (转)ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS)

    转:https://www.cnblogs.com/savorboard/archive/2016/10/17/dotnet-benchmarks.html 前言 性能是我们日常生活中经常接触到的一个 ...