C# 多线程 AutoResetEvent和ManualResetEvent
2017-04-20 17:19
357 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MutiThreadTest
{
class Program
{
static void Main(string[] args)
{
Thread SeekBookThread = new Thread(new ThreadStart(TestMutiThrd.SeekProc));
SeekBookThread.Name = "扫描线程";
SeekBookThread.Start();
Thread payMoneyThread = new Thread(new ThreadStart(TestMutiThrd.PayMoneyProc));
payMoneyThread.Name = "付钱线程";
payMoneyThread.Start();
Thread getBookThread = new Thread(new ThreadStart(TestMutiThrd.GetBookProc));
getBookThread.Name = "取书线程";
getBookThread.Start();
for (int i = 1; i <= TestMutiThrd.numIterations; i++)
{
Console.WriteLine("买书线程:书本{0}", i);
TestMutiThrd.number = i;
//Signal that a value has been written.
TestMutiThrd.SekEvent.Set();//解锁扫描线程
TestMutiThrd.buyResetEvent.WaitOne();//等待买书所有线程执行结束,才能继续
Thread.Sleep(0);
}
Thread.Sleep(1000);
Console.ReadLine();
SeekBookThread.Abort();
payMoneyThread.Abort();
getBookThread.Abort();
}
}
public class TestMutiThrd
{
public const int numIterations = 10;
//买书
public static AutoResetEvent buyResetEvent = new AutoResetEvent(false);
//扫描
public static AutoResetEvent SekEvent = new AutoResetEvent(false);
//付钱
public static AutoResetEvent PayEvent = new AutoResetEvent(false);
//取书
public static AutoResetEvent GetEvent = new AutoResetEvent(false);
//付钱和取书
public static ManualResetEvent PayGetEvent = new ManualResetEvent(false);
public static ReaderWriterLock RWLock = new ReaderWriterLock();
//static ManualResetEvent myResetEvent = new ManualResetEvent(false);
//static ManualResetEvent ChangeEvent = new ManualResetEvent(false);
public static int number; //这是关键资源
public static TestMutiThrd OTestMutiThrd = new TestMutiThrd();
public int NumIterations
{
get
{
return numIterations;
}
}
/// <summary>
/// 扫描过程
/// </summary>
public static void SeekProc()
{
while (true)
{
SekEvent.WaitOne();
//SekEvent.Reset();
Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
Thread.Sleep(0);
//PayEvent.Set();//解锁付款线程
PayGetEvent.Set();//同时解锁付款和取书线程
}
}
/// <summary>
/// 付钱过程
/// </summary>
public static void PayMoneyProc()
{
while (true)
{
PayGetEvent.WaitOne();
//PayEvent.WaitOne();
Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
Thread.Sleep(10);
//GetEvent.Set();//解锁取书线程
}
}
/// <summary>
/// 取书过程
/// </summary>
public static void GetBookProc()
{
while (true)
{
PayGetEvent.WaitOne();
PayGetEvent.Reset();//不加 无限执行下去
//GetEvent.WaitOne();
Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
Console.WriteLine("------------------------------------------");
Thread.Sleep(10);
buyResetEvent.Set();//解锁买书线程
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MutiThreadTest
{
class Program
{
static void Main(string[] args)
{
Thread SeekBookThread = new Thread(new ThreadStart(TestMutiThrd.SeekProc));
SeekBookThread.Name = "扫描线程";
SeekBookThread.Start();
Thread payMoneyThread = new Thread(new ThreadStart(TestMutiThrd.PayMoneyProc));
payMoneyThread.Name = "付钱线程";
payMoneyThread.Start();
Thread getBookThread = new Thread(new ThreadStart(TestMutiThrd.GetBookProc));
getBookThread.Name = "取书线程";
getBookThread.Start();
for (int i = 1; i <= TestMutiThrd.numIterations; i++)
{
Console.WriteLine("买书线程:书本{0}", i);
TestMutiThrd.number = i;
//Signal that a value has been written.
TestMutiThrd.SekEvent.Set();//解锁扫描线程
TestMutiThrd.buyResetEvent.WaitOne();//等待买书所有线程执行结束,才能继续
Thread.Sleep(0);
}
Thread.Sleep(1000);
Console.ReadLine();
SeekBookThread.Abort();
payMoneyThread.Abort();
getBookThread.Abort();
}
}
public class TestMutiThrd
{
public const int numIterations = 10;
//买书
public static AutoResetEvent buyResetEvent = new AutoResetEvent(false);
//扫描
public static AutoResetEvent SekEvent = new AutoResetEvent(false);
//付钱
public static AutoResetEvent PayEvent = new AutoResetEvent(false);
//取书
public static AutoResetEvent GetEvent = new AutoResetEvent(false);
//付钱和取书
public static ManualResetEvent PayGetEvent = new ManualResetEvent(false);
public static ReaderWriterLock RWLock = new ReaderWriterLock();
//static ManualResetEvent myResetEvent = new ManualResetEvent(false);
//static ManualResetEvent ChangeEvent = new ManualResetEvent(false);
public static int number; //这是关键资源
public static TestMutiThrd OTestMutiThrd = new TestMutiThrd();
public int NumIterations
{
get
{
return numIterations;
}
}
/// <summary>
/// 扫描过程
/// </summary>
public static void SeekProc()
{
while (true)
{
SekEvent.WaitOne();
//SekEvent.Reset();
Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
Thread.Sleep(0);
//PayEvent.Set();//解锁付款线程
PayGetEvent.Set();//同时解锁付款和取书线程
}
}
/// <summary>
/// 付钱过程
/// </summary>
public static void PayMoneyProc()
{
while (true)
{
PayGetEvent.WaitOne();
//PayEvent.WaitOne();
Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
Thread.Sleep(10);
//GetEvent.Set();//解锁取书线程
}
}
/// <summary>
/// 取书过程
/// </summary>
public static void GetBookProc()
{
while (true)
{
PayGetEvent.WaitOne();
PayGetEvent.Reset();//不加 无限执行下去
//GetEvent.WaitOne();
Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number);
Console.WriteLine("------------------------------------------");
Thread.Sleep(10);
buyResetEvent.Set();//解锁买书线程
}
}
}
}
相关文章推荐
- 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
- C# 线程间互相通信 AutoResetEvent和ManualResetEvent
- 【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent
- C# 多线程 线程调度Dispatcher ,ManualResetEvent
- 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
- C#深入理解AutoResetEvent和ManualResetEvent
- C# ManualResetEvent和AutoResetEvent 使用笔记
- 多线程编程之 AutoResetEvent和ManualResetEvent
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
- C# 定时器和队列结合,卖包子啦,Timer、 AutoResetEvent、 ManualResetEvent
- C# ManualResetEvent和AutoResetEvent 使用笔记
- 白话并发冲突与线程同步(3)——Mutex、EventWaitHandle、AutoResetEvent 和 ManualResetEvent
- AutoResetEvent和ManualResetEvent
- [多线程] WaitHandle.WaitAll ManualResetEvent 等待所有线程完成
- AutoResetEvent 与 ManualResetEvent<转>
- 关于AutoResetEvent和ManualResetEvent
- C#老生常谈之AutoResetEvent和ManualResetEvent
- AutoResetEvent和ManualResetEvent