线程并发的生产者-消费者模型:

1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者。

2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据。

3.消费者从共享内存资源取数据,如果区域空,则等待生产者填充数据。

4.生产者的填充数据行为和消费者的消费数据行为不可在同一时间发生。

下面用Windows的信号量以及线程等API模拟生产者-消费者模型

#include <Windows.h>
#include <stdio.h>
#define N 100
#define TRUE 1
typedef int Semaphore;
Semaphore full = , Empty = N; //共享资源区满槽数目和空槽数目
int in = , out = ; //缓冲区生产,消费数据指针
HANDLE mutex;
int ProducerThread[];
int ConsumerThread[];
int Buffer[N+]; //缓冲区 int produce_item() { //生产(随机数)
return (rand()%N + N)%N;
} int insert_item(int item) { //插入资源
in %= N;
printf("生产到缓冲区槽: %d\n",in);
Buffer[in] = item;
return Buffer[in++];
} int remove_item() { //移出资源
out %= N;
printf(" 取走缓冲区槽 %d 的数\n",out);
return Buffer[out++];
} int consume_item(int item) {
//consume it
} void down(HANDLE handle) { //wait / P
WaitForSingleObject(handle, INFINITE);
} void up(HANDLE handle) { //signal / V
ReleaseSemaphore(handle, , NULL);
} DWORD WINAPI producer(LPVOID v) { int item; while(TRUE) { item = produce_item();
if(Empty > ) { //down(empty)
Empty--;
down(mutex); //down(mutex)
insert_item(item);
full++; //up(full)
up(mutex); //up(mutex)
} Sleep();
}
return ;
} DWORD WINAPI consumer(LPVOID v) { int item; while(TRUE) { if(full > ) { //down(full)
full--;
down(mutex); //down(mutex)
item = remove_item();
consume_item(item);
Empty++; //up(empty)
up(mutex); //up(mutex)
} Sleep();
}
return ;
} int main()
{
DWORD Tid; mutex = CreateSemaphore( //创建互斥信号量mutex
NULL,
,
,
NULL
); for(int i=;i<;i++) {
ProducerThread[i] = i+;
CreateThread( //创建生产者线程
NULL, //不能被子线程继承
, //默认堆栈大小
producer, //生产者函数
&ProducerThread[i], //传参
, //创建后立即执行
&Tid //线程ID
);
ConsumerThread[i] = i+;
CreateThread(NULL,,consumer,&ConsumerThread[i],,&Tid); //创建消费者线程
} Sleep();
return ;
}

运行结果:

或者使用自定义的信号量mutex来实现:

#include <Windows.h>
#include <stdio.h>
#define N 100
#define TRUE 1
typedef int Semaphore;
Semaphore mutex = ; //互斥信号量
Semaphore full = , Empty = N; //临界区满槽数目和空槽数目
int in = , out = ; //缓冲区生产,消费数据指针
int ProducerThread[];
int ConsumerThread[];
int Buffer[N+]; //缓冲区 int produce_item() { //生产随机数
return (rand()%N + N)%N;
} int insert_item(int item) { //插入临界区
in %= N;
printf("生产到缓冲区槽: %d\n",in);
Buffer[in] = item;
return Buffer[in++];
} int remove_item() { //移出临界区
out %= N;
printf(" 取走缓冲区槽 %d 的数\n",out);
return Buffer[out++];
} int consume_item(int item) {
//consume it
} DWORD WINAPI producer(LPVOID v) { int item; while(TRUE) { item = produce_item(); //生产物品
Empty--; //P(Empty)
if(Empty < ) //没有空槽可以添加数据
Empty++; //还原Empty,继续循环等待
else if(mutex > ) { //否则如果mutex = 1,临界区未被访问
mutex--; //加锁
insert_item(item); //往临界区填入数据
full++; //满槽数加1
mutex++; //释放锁
}
Sleep();
}
return ;
} DWORD WINAPI consumer(LPVOID v) { int item; while(TRUE) { full--; //P(full)
if(full < ) //如果没有满槽,无法消费
full++; //还原full,继续等待
else if(mutex > ) { //否则如果mutex = 1,临界区未被访问
mutex--; //加锁
item = remove_item(); //将数据移出临界区
consume_item(item); //消费
Empty++; //空槽数目加1
mutex++; //释放锁
} Sleep();
}
return ;
} int main()
{
DWORD Tid; for(int i=;i<;i++) {
ProducerThread[i] = i+;
CreateThread(NULL,,producer,,,&Tid);
ConsumerThread[i] = i+;
CreateThread(NULL,,consumer,,,&Tid);
} Sleep();
return ;
}

也能达到效果:

【Windows】用信号量实现生产者-消费者模型的更多相关文章

  1. day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,

    六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...

  2. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  3. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  4. Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue

    进程同步: 1. 锁 (重点)    锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...

  5. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))

    昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...

  6. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  7. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

  8. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  9. Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

    Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...

随机推荐

  1. 图解DataGridView编辑列

    WinForm中DataGridView功能强大,除了可以自动绑定数据源外,还可以根据需求编辑列.下面以截图说明添加编辑列的步骤(HoverTreeSCJ 项目实际界面). 1.选择DataGridV ...

  2. 流行ORM产品优缺点分析--EntityFramework、NHibernate、PetaPoco

    什么是ORM? ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操 ...

  3. Asp.net 面向接口可扩展框架之类型转化基础服务

    新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...

  4. PHP 命名空间(namespace)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  5. Lind.DDD.Events事件总线~自动化注册

    回到目录 让大叔兴奋的自动化注册 对于领域事件之前说过,在程序启动时订阅(注册)一些事件处理程序,然后在程序的具体位置去发布(触发)它,这是传统的pub/sub模式的体现,当然也没有什么问题,为了让它 ...

  6. GJM : 各大开发游戏引擎

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. GJM :C#开发 异步处理是目的,多线程是手段

    但是BeginAccept和EndAccept不就是system.net.socket封装好的异步socket吗如果用多线程来实现的话那就不叫异步了吧 1.再次强调,异步是目的,多线程是手段. 所谓异 ...

  8. 使用MyEclipse 开发struts2框架结构详细教程——以登录为例

    1.首先建立Web Project,名称为:struts2 ,然后选择Java EE6.0,点击Finish. 2.右击“struts”选择MyEclipse->Add Struts Capab ...

  9. [threeJs][新浪股票api][css3]3D新浪财经数据-最近A股涨的也太疯了......

    使用threeJS搭配新浪股票财经API 在线: http://wangxinsheng.herokuapp.com/stock 截图: A股涨幅榜[一片红10%] 检索[单击添加到自选内,自选使用l ...

  10. iOS---A valid provisioning profile for this executable was not found

    把Target中的Code Signing Identity也设置成iPhone Develop就ok了,这样一切都说的通了,唯一不合理的就是在Project切换Code Signing Identi ...