C#多线程--仓库问题引发的故事
假设有这么个场景,一个仓库,里面有N件货物,现有六个搬运工(用线程模拟),其中2个向仓库放东西,4个往外搬东西。假设1秒能向里放2件货物,同时可向外搬3件货物(线程休眠),现在需要往里放M件货物,一旦仓库有货就要向外搬,这个东西怎么设计?
这显然牵扯到线程同步的问题。本来,考虑的有点简单了,只用了一个锁,但结果是在执行一个动作的同时,另一个动作一直在等待(比如,放的时候,搬的线程等待放完后,才能开始运行),也就是在一秒内,只能放或者搬,这样的话,还不如一个线程全跑下来了,还省事。思考良久后,请教了一下,原来这种问题要放两个线程锁(对应两个动作),恍然大悟。好了,别的不说了,直接上这货的代码吧:假设N和M都为15,标准情况下需要放一个队列,现在只用最简单的数字来模拟吧
class Operator
{
static int pushNum = ;
static int num = ; private object locker1 = new object();//这个锁负责往里放
private object locker2 = new object();//这个锁负责往外拿 public int Total
{
get { return num; }
} public int PushTotal
{
get { return pushNum ; }
} public void setPushNum(int t)
{
pushNum = t;
lock (locker1)
{
Monitor.PulseAll(locker1);
}
} public void Push()
{
while ( == )
{
lock (locker1)
{
if (pushNum <= )
{
try
{
Monitor.Wait(locker1);
}
catch (SynchronizationLockException e)
{
Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
Console.WriteLine(e);
}
}
else
{
Thread.Sleep();
pushNum--;
num++; Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("放入一件商品,此时还剩数量:{0},\t还需要放的数量:{1},\t搬运工:{2}", num, pushNum,
Thread.CurrentThread.Name); lock (locker2)
{
Monitor.PulseAll(locker2);
}
}
}
}
} public void Pull()
{
while ( == )
{
lock (locker2)
{
if (num <= )
{
try
{
Monitor.Wait(locker2);
}
catch (SynchronizationLockException e)
{
Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
Console.WriteLine(e);
}
}
else
{ Thread.Sleep();
num--;
Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("搬出一件商品,此时还剩商品数:{0}\t搬运工:{1}",num , Thread.CurrentThread.Name); }
}
}
}
}
上面的红色字体显示了两个线程锁,以及激活其他线程的时间段,下面贴上主线程:
static void Main(string[] args)
{
Operator op=new Operator(); Random r=new Random(); Thread thread1 = new Thread(new ThreadStart(op.Push));
thread1.Name = "push[1]";
Thread thread2 = new Thread(new ThreadStart(op.Push));
thread2.Name = "push[2]";
//Thread thread3 = new Thread(new ThreadStart(op.Push));
//thread3.Name = "push[3]";
//Thread thread4 = new Thread(new ThreadStart(op.Push));
//thread4.Name = "push[4]"; Thread thread11 = new Thread(new ThreadStart(op.Pull));
thread11.Name = "pull[1]";
Thread thread12 = new Thread(new ThreadStart(op.Pull));
thread12.Name = "pull[2]";
Thread thread13 = new Thread(new ThreadStart(op.Pull));
thread13.Name = "pull[3]";
Thread thread14 = new Thread(new ThreadStart(op.Pull));
thread14.Name = "pull[4]"; try
{ thread1.Start();
thread2.Start();
//thread3.Start();
//thread4.Start(); thread11.Start();
thread12.Start();
thread13.Start();
thread14.Start(); do
{
if (op.Total == &&op.PushTotal==)
{
Console.WriteLine("是否继续放入 Y/N");
while (Console.ReadLine().ToUpper() == "Y")
{
Console.WriteLine("输入数量:"); int t;
Int32.TryParse(Console.ReadLine(), out t);
op.setPushNum(t);
} }
else
{
Thread.Sleep();
}
} while (true);
}
catch (ThreadStateException e)
{
Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
Console.WriteLine(e);
}
}
效果图如下:
当按下y后,继续激活等待的线程:
aaarticlea/png;base64,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" alt="" />
C#多线程--仓库问题引发的故事的更多相关文章
- 一个由单例模式在多线程环境下引发的 bug
问题症状 HTTP 日志系统,老是出现日志信息覆盖的情况.比如同时调用 A 接口和 B 接口,B 接口请求响应信息变成了 A 接口请求响应相关信息.这个问题在并发量大的情况下越来越严重. 问题初步分析 ...
- 多线程:QueueUserWorkItem引发的闭包与变量共享
//1. public void SaveModel(testmodel msg) { ThreadPool.QueueUserWorkItem(new WaitCallback(SaveModelT ...
- 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程
发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (va ...
- Python3.4 多线程
线程安全和全局解释器锁 Thread State and the Global Interpreter Lock 总结: 通过使用GIL后, Python多线程安全, 并且数据保持同步. Python ...
- Java OOP——第七章 多线程
1.进程:是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间): Eg:用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间.当用户再次点击左面的IE浏览器, ...
- 第13章 C#中的多线程
章多线程 13.1 线程概述 计算机的操作系统多采用多任务和分时设计.多任务是指在一个操作系统中开以同时运行多个程序.例如,可以在使用QQ聊天的同时听音乐,即有多个独立的任务,每个任务对应一个进程,每 ...
- JDK8 HashMap 源码解析
HashMap中数据结构 在jdk1.7中,HashMap采用数组+链表(拉链法).因为数组是一组连续的内存空间,易查询,不易增删,而链表是不连续的内存空间,通过节点相互连接,易删除,不易查询.Has ...
- 阿里开源 iOS 协程开发框架 coobjc!--异步编程的问题与解决方案
阿里妹导读:刚刚,阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc,开发者们可以在 Github 上自主下载.coobjc是为iOS平台打造的开源协程开发框架,支持O ...
- 十个问题带你了解和掌握java HashMap
十个问题带你了解和掌握java HashMap 一.前言 本篇内容是源于 " 由阿里巴巴Java开发规约HashMap条目引发的故事",并在此基础上加了自己的对HashMap更多的 ...
随机推荐
- SSIS从理论到实战,再到应用(7)----常用的数据类型转换操作
原文:SSIS从理论到实战,再到应用(7)----常用的数据类型转换操作 上期回顾: SSIS从理论到实战,再到应用(6)----SSIS的自带日志功能 在抽取各种应用的数据时候,经常会遇到数据需要转 ...
- Yii Framework2.0开发教程(5)数据库mysql性能
继续<Yii Framework2.0开发教程(3)数据库mysql入门> 首先给予一定的尊重yii2数据库支持引进 Yii 基于 PHP's PDO一个成熟的数据库访问层的建立.它提供了 ...
- html浏览器兼容性 JavaScript语法
1. 在FireFox中能够使用与HTML节点对象ID属性值同样的JS变量名称,可是IE中不行. 解决的方法:在命名上区分HTML节点对象ID属性值和JS变量 2. IE不支持JS ...
- mac_Mac item2常用快捷键
整理使用 iTerm 2 过程中得常用快捷键,Mac 原来自带的终端工具 Terminal 不好用是出了名的,虽然最近几个版本苹果稍微做了些优化,功能上,可用性方面增强不少,无奈有个更好用的 Iter ...
- hadoop排序组合键的使用情况
于hadoop当处理复杂的业务,需要使用组合键,与单纯的复杂的继承Writable接口,但继承WritableComparable<T>接口.事实上.WritableComparable& ...
- Swift语言指南(五)--数字字面量和数字类型转换
原文:Swift语言指南(五)--数字字面量和数字类型转换 数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 ...
- 赵雅智_Android编码规范
凝视 导入mycodetemplates.xml统一凝视样式 须要加凝视的地方 类凝视(必加) 方法凝视(必加) 块凝视主要是数据结构和算法的描写叙述(必加) 类成员变量和常量凝视(选择性加入) 单行 ...
- tinyxml 查找element
下面这段代码是网上找来的,很是经典 bool GetNodePointerByName(TiXmlElement* pRootEle, const char* strNodeName,TiXmlEle ...
- python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹
python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...
- HDU 5045 Contest
pid=5045">主题链接~~> 做题感悟:比赛时这题后来才写的,有点小尴尬.两个人商议着写写了非常久才写出来,I want to Powerful ,I believe me ...