博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Semaphore的应用
阅读量:6149 次
发布时间:2019-06-21

本文共 2505 字,大约阅读时间需要 8 分钟。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace SynchronizationContext{    internal interface IQueueReader
: IDisposable { T Dequeue(); void ReleaseReader(); } internal interface IQueueWriter
: IDisposable { void Enqueue(T data); } internal class BlockingQueue
: IQueueReader
, IQueueWriter
, IDisposable { // use a .NET queue to store the data private Queue
mQueue = new Queue
(); // create a semaphore that contains the items in the queue as resources. // initialize the semaphore to zero available resources (empty queue). private Semaphore mSemaphore = new Semaphore(0, int.MaxValue); // a event that gets triggered when the reader thread is exiting private ManualResetEvent mKillThread = new ManualResetEvent(false); // wait handles that are used to unblock a Dequeue operation. // Either when there is an item in the queue // or when the reader thread is exiting. private WaitHandle[] mWaitHandles; public BlockingQueue() { mWaitHandles = new WaitHandle[2] { mSemaphore, mKillThread }; } public void Enqueue(T data) { lock (mQueue) { mQueue.Enqueue(data); //mQueue.Enqueue(data);//test } // add an available resource to the semaphore, // because we just put an item // into the queue. mSemaphore.Release(); //mSemaphore.Release(2);//test } public T Dequeue() { // wait until there is an item in the queue WaitHandle.WaitAny(mWaitHandles); lock (mQueue) { if (mQueue.Count > 0) return mQueue.Dequeue(); } return default(T); } public void ReleaseReader() { mKillThread.Set(); } void IDisposable.Dispose() { if (mSemaphore != null) { mSemaphore.Close(); mQueue.Clear(); mSemaphore = null; } } }}

出处:

namespace SynchronizationContext{    class Program    {        static void Main(string[] args)        {            BlockingQueue
bq = new BlockingQueue
(); //线程t1向bq中延迟插入数据 Thread t1 = new Thread(() => { Thread.Sleep(4000); bq.Enqueue("test"); }); t1.Start(); //在t1将test加入到bq前,这个操作被阻塞4s左右 string d = bq.Dequeue(); Console.WriteLine("d:" + d); //Semaphore使用保证了队列中没有东西的时候出出队列的操作都是阻塞的 string d2 = bq.Dequeue(); Console.WriteLine("d2:" + d2); string d3 = bq.Dequeue(); Console.WriteLine("d3:" + d3); } }}

 

转载地址:http://xxgya.baihongyu.com/

你可能感兴趣的文章
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
javascript性能优化
查看>>
多路归并排序之败者树
查看>>
java连接MySql数据库
查看>>
转:Vue keep-alive实践总结
查看>>
深入python的set和dict
查看>>
C++ 11 lambda
查看>>
Android JSON数据解析
查看>>
DEV实现日期时间效果
查看>>
java注解【转】
查看>>
centos 下安装g++
查看>>
嵌入式,代码调试----GDB扫盲
查看>>
类斐波那契数列的奇妙性质
查看>>
下一步工作分配
查看>>
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>
jQuery最佳实践
查看>>