文档章节

C# 信号量与阻塞队列

Eumenidies
 Eumenidies
发布于 2014/06/11 15:16
字数 285
阅读 278
收藏 0

最近做网络综合性实验做一个即时通讯软件的时候,有这样一个情景:某个客户与另外多个客户端进行聊天,由于新消息到达的不确定性,即不知道来不来和不知道什么时候来。

如果用while true + sleep的话有点太浪费资源了,因为现在就是用一个队列里获取消息对象的,于是想做一个阻塞队列。

码农还是直接贴代码吧:

using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace IMClient
{
    public class BlockingQueue<T> : ConcurrentQueue<T>
    {
        private Semaphore semaphore;

        public BlockingQueue()
        {
            semaphore = new Semaphore(0, Int32.MaxValue);//消息不知道有多少,设个足够大的吧,初始=0
        }

        public T Dequeue()
        {
            T t = default(T);//创建一个类型T的对象
            semaphore.WaitOne();//请求信号量,信号量=0,就会阻塞了
            base.TryDequeue(out t);//然后出队,继承于同步队列,因此不用加锁了
            return t;
        }

        public new T TryDequeue(out T t) 
        {
            throw new Exception("Unsupport Method Exception");//对不起,我想你用上面的Dequeue方法
        }

        public new void Enqueue(T t)
        {
            base.Enqueue(t);//出队
            semaphore.Release();//释放信号量
        }
    }
}


© 著作权归作者所有

共有 人打赏支持
Eumenidies
粉丝 4
博文 4
码字总数 2569
作品 0
广州
程序员
私信 提问
一个进程间同步和通讯的 C# 框架

threadmsg_demo.zip ~ 41KB 下载 threadmsg_src.zip ~ 65KB 下载 0.背景简介 微软在 .NET 框架中提供了多种实用的线程同步手段,其中包括 monitor 类及 reader-writer锁。但跨进程的同步方法...

oschina
2013/02/07
18.2K
11
手把手教你如何玩转操作系统(信号量和PV操作专题)

请认真看完本篇专题文章哦,我相信,如果你是认真,用心看完我的这篇文章,我认为你,针对开始点击这篇文章的初衷,肯定可以解决你的疑惑那么,往下看~---------- 一:信号量的本质 信号量(...

cs_hnu_scw
2018/05/05
0
0
Python线程同步机制: Locks, RLocks, Semaphores, Condition

翻译自Laurent Luce的博客 原文名称:Python threads synchronization: Locks, RLocks, Semaphores, Conditions, Events and Queues 原文连接:http://www.laurentluce.com/posts/python-thr......

好铁
2016/03/25
37
0
Java并发编程笔记之Semaphore信号量源码分析

JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那么,Semaphore 的内部实现是怎样的呢? ...

狂小白
2018/07/08
0
0
linux/unix下多进程间的通信

进程:进程是计算机运行的基本单位,利用多进程可以实现系统的多任务;但是,在多进程的任务中,进程之间的通信是比较麻烦的,因为,进程之间使用的是不同的进程空间,所以,编写多进程的系统...

陈小花与胡汉三
2013/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 做一只舔狗,开心时就去舔她,不开心时就舔自己

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @温家成 :分享连诗雅的单曲《水星逆行》 《水星逆行》- 连诗雅 手机党少年们想听歌,请使劲儿戳(这里) @罗马的王 :在家嫌猫吵,去书城看书...

小小编辑
31分钟前
20
3
Ruby中的继承、原型、面向对象、访问域

先有类还是先有对象 从鸡蛋悖论解决可以悟到一个道理,不要从常识上假设非此即彼和绝对静止。 Ruby中的类和对象正是这么个东西 我们创建一个类,那它就是Class这个对象的实例,而Class,于是...

可数局部基
今天
4
0
什么时候使用字节流、什么时候使用字符流,二者的区别

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 InputStream 和OutputStream,...

watermelon11
今天
6
0
Alpakka Kafka,反应式Kafka客户端

Alpakka Kafka 是一个要用于 Java 和 Scala 语言的开源的流感知和反应式集成数据线项目。它建立在 Akka Stream之上,提供了 DSL 来支持反应式和流式编程,内置回压功能。Akka Streams 是 Re...

羊八井
今天
5
0
PHP7源码编译安装详解

$ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \freetype-devel libpng libpng-devel libxml2 ......

问题终结者
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部