#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. python多进程详解和协程

    1.由于python多线程适合于多IO操作,但不适合于cpu计算型工作,这时候可以通过多进程实现.python多进程简单实用 # 多进程,可以cpu保持一致,python多线程适合多io.对于高cpu ...

  2. 中国大学MOOC-JAVA学习(浙大翁恺)—— 时间换算

    import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto- ...

  3. 003.2---asyncio模块(上)

    asyncio(上) asyncio 的几个概念 event_loop(事件循环):程序开启一个无线的循环,程序员会把一些函数(协程)注册到事件循环上,当满足事件发生的时候,调用相应的协程函数. co ...

  4. 创建自定义view(翻译 androidtraining)

    创建自定义view 一个设计良好的的自定义view应该是一个设计良好的class,它包含了很多实用的功能,让人们更加容易使用接口.它充分利用GPU与内存的性能等等. 另外作为一个设计良好的类,一个自定 ...

  5. 3Dchart理解

    想在Flex Chart中为图例设置3D效果,近几天查找了些资料,动手做了个DEMO供大家参考!   DEMO演示地址http://xingjunli.webs.com/flash/flexChart ...

  6. 2016-2017-2 20155302 实验二《Java面向对象程序设计》实验报告

    2016-2017-2 20155302 实验二<Java面向对象程序设计>实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握U ...

  7. 2017-2018-1 20155320《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155320<信息安全技术>实验二--Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 实验 ...

  8. 使GDAL库支持中文路径或中文文件名的处理方法

    之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图: 解决方法: 1.      在所有使用GDALAllRegist ...

  9. 三边定位 c#

    MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分. 项目中用到三 ...

  10. 一个自己实现的string

    最近实现了一个string类,添加了一些c++11元素. 除了基本的构造析构函数,拷贝构造和赋值函数,另外添加移动拷贝和赋值函数.default是一个很方便的特性有木有. //default cons ...