C#生产者与消费者问题

/*
 * Created by SharpDevelop.
 * User: huangyibiao
 * Date: 2013/8/27
 * Time: 11:12
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Threading;

namespace ThreadTest
{
	class Program
	{
		public static void Main(string[] args)
		{
			// create share resource
			Resource sharedResource = new Resource();

			ProduceThread produceThread = new ProduceThread(sharedResource);
			ConsumeThread consumeThread = new ConsumeThread(sharedResource);

			// create two thread
			Thread producer = new Thread(new ThreadStart(produceThread.Run));
			Thread consumer = new Thread(new ThreadStart(consumeThread.Run));

			try
			{
				producer.Start();
				consumer.Start();

				producer.Join();
				consumer.Join();
			}
			catch (ThreadStateException e)
			{
				Console.WriteLine(e.ToString());
			}

			Console.ReadKey();
		}

	}

	public class ProduceThread
	{
		/// <summary>
		/// share resource
		/// </summary>
		Resource _resource;

		public ProduceThread(Resource res)
		{
			_resource = res;
		}

		// begin to produce
		public void Run()
		{
			for (int i = 0; i < 10; ++i)
			{
				_resource.Produce();
			}
		}
	}

	public class ConsumeThread
	{
		/// <summary>
		/// share resource
		/// </summary>
		Resource _resource;

		public ConsumeThread(Resource res)
		{
			_resource = res;
		}

		public void Run()
		{
			for (int i = 0; i < 10; ++i)
			{
				_resource.Consume();
			}
		}
	}

	public class Resource
	{
		int _resourceContent = 0;
		bool _flag = false;

		/// <summary>
		/// consume method
		/// </summary>
		public void Consume()
		{
			while (!_flag)// if flag == false, enter loop-waiting
				;

			Console.WriteLine("Consumer: {0}", _resourceContent);

			// set _flag to be false, it means that consuming finished.
			_flag = false;
		}

		/// <summary>
		/// puroduce method
		/// </summary>
		public void Produce()
		{
			// if _flag == true, enter loop-waiting
			while (_flag)
				;

			++_resourceContent;
			Console.WriteLine("Producer: {0}", _resourceContent);
			_flag = true;// produce finished
		}
	}
}
时间: 2024-08-16 04:40:42

C#生产者与消费者问题的相关文章

Ruby实现生产者和消费者代码分享

  这篇文章主要介绍了Ruby实现生产者和消费者代码分享,本文直接给出实现代码,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #ruby实现生产者和消费者代码   require 'thread' queue = Queue.new consumers = Thread.new do 5.times do |i| obj = queue.pop print "consumer :#{i}n"

JAVA线程中的生产者和消费者问题

生产者消费者问题是研究多线程时绕不开的问题,描述的是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止. 解决生产者消费者问题的方法有两种,一种是采用某种机制保持生产者和消费者之间的同步,一种是在生产者和消费者之间建立一个管道.前一种有较高的效率并且可控制性较好,比较常用,后一种由于管道缓冲区不易控制及被传输数据对象不易封装等原因,比较少用. 同步问题的核心在

Java并发编程中的生产者与消费者模型简述_java

概述对于多线程程序来说,生产者和消费者模型是非常经典的模型.更加准确的说,应该叫"生产者-消费者-仓库模型".离开了仓库,生产者.消费者就缺少了共用的存储空间,也就不存在并非协作的问题了. 示例定义一个场景.一个仓库只允许存放10件商品,生产者每次可以向其中放入一个商品,消费者可以每次从其中取出一个商品.同时,需要注意以下4点: 1.  同一时间内只能有一个生产者生产,生产方法需要加锁synchronized. 2.  同一时间内只能有一个消费者消费,消费方法需要加锁synchroni

线程-生产者与消费者问题(JAVA实现)

问题描述 生产者与消费者问题(JAVA实现) public class TestProducerConsumer{ public static void main(String[] agrs){ SyncStack ss = new SyncStack(); Producer p = new Producer(ss); ConSumer c = new ConSumer(ss); new Thread(p).start(); new Thread(c).start(); }}class Woto

并发无锁队列学习之二【单生产者单消费者】

1.前言 最近工作比较忙,加班较多,每天晚上回到家10点多了.我不知道自己还能坚持多久,既然选择了就要做到最好.写博客的少了.总觉得少了点什么,需要继续学习.今天继续上个开篇写,介绍单生产者单消费者模型的队列.根据写入队列的内容是定长还是变长,分为单生产者单消费者定长队列和单生产者单消费者变长队列两种.单生产者单消费者模型的队列操作过程是不需要进行加锁的.生产者通过写索引控制入队操作,消费者通过读索引控制出队列操作.二者相互之间对索引是独享,不存在竞争关系.如下图所示: 2.单生产者单消费者定长

java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]

线程通信,线程之间的消息传递: 多个线程在操作同一个资源,但对共享资源的操作动作不同:它们共享同一个资源,互为条件,相互依赖,相互通信让任务向前推进. 线程的同步,可以解决并发更新同一个资源,实现线程同步;但不能用来实现线程间的消息传递. 线程通信生产者和消费者和仓库是个典型模型: 生产者:没有生产之前通知消费者等待,生产产品结束之后,马上通知消费者消费 消费者:没有消费之前通知生产者等待,消费产品结束之后,通知生产者继续生产产品以供消费 线程通信:使用java中Object中提供的: publ

使用Lock来实现生产者和消费者问题

前面写过:synchronize来实现生产者和消费者问题 现在用Lock来实现它 1 package com.thread; 2 3 import java.util.LinkedList; 4 import java.util.concurrent.locks.Condition; 5 import java.util.concurrent.locks.Lock; 6 import java.util.concurrent.locks.ReentrantLock; 7 8 9 /* 10 使用

java 多线程生产者和消费者模式,怎么实现边生产边消费?

问题描述 java 多线程生产者和消费者模式,怎么实现边生产边消费? 如何使用java语言开发处理一批数据,使处理时间变快,而又不遗漏数据呢?? 解决方案 看瓶颈在哪里,如果是cpu.io的开销,性能不可能无限提高.如果存在网络延迟等,可以用多线程隐藏延迟,达到提高性能的目的. 解决方案二: 你说的什么叫边生产边消费呢?生产者消费者设计实现设计中生产者把数据放入队列,消费者从队列中获取数据处理,消除了生产者和消费者之间的代码依赖.该模式将生产数据的过程与使用数据的过程解耦,简化了由于这两个过程不

linux多线程学习(七)——实现“生产者和消费者”

在上一篇文章中,利用信号量实现了线程间的互斥,这一篇将要利用信号量的互斥同步机制来实现一个经典实例,就是"生产者和消费者". 1.简单描述生产者和消费者的问题. 有一个缓冲区和两个线程:生产者和消费者.生产者把产品放入缓冲区,而消费者从缓冲区中拿走.当缓冲区满时,生产者必须等待:另外,当缓冲区空时,消费者必须等待,并且缓冲区不能同时进行生产者和消费者的操作. [cpp:nogutter] view plaincopy #include <stdio.h>     #incl

深入并行:从生产者到消费者模型深度理解Oracle的并行

陈焕生 Oracle Real-World Performance Group 成员,senior performance engineer,专注于 OLTP.OLAP 系统 在 Exadata 平台和 In-Memory 特性上的最佳实践.个人博客 http://dbsid.com . 编辑手记:感谢陈焕生授权我们发布他的精品文章,Sidney撰写这个系列的文章时间跨度也有两年,下篇刚刚出炉,我们先从他去年投稿的第一篇开始. Oracle 的并行执行 Oracle 的并行执行是一种分而治之的方