`
varsoft
  • 浏览: 2435357 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现

阅读更多

具体的需求是 在某一时间点,只有N个线程在并发执行,如果有多余的线程,则排队等候~

还真是费尽心思啊~最终还是被我攻克了~

下面我就来说说具体的实现

C#提供了Mutex与Interlocked这两个与线程相关的类,都在Threading命名空间下~!

Mutex中提供了WiteOne,ReleaseMutex 两个实例方法~

WiteOne的作用是"阻塞当前线程,提供对该线程的原子操作"

也就是说当一个线程遇到WiteOne的时候,如果在WiteOne里面没有线程在操作,则此线程进去操作

而里面有线程的时候,所有到此的线程均需要排队等候里面的线程执行完毕~

而控制这样操作的结束标记就是使用ReleaseMutex 方法!

就好比WiteOne是一把锁一样~而ReleaseMutex 就是一把钥匙

当10个人都看到这个门的时候,第一个到达门口的人会看到屋子里没有人,则他进去,同时会把门锁上~

后面的人自然要在门口等候,当此人在屋子里执行完任务后他会用钥匙把门打开!

出去后把锁交给门口排队的第二位同志,第二位同志再做同样的操作

如果第一位同志执行完任务以后不把使用权交给第二个人的话,而直接退出

那么屋子自然就空了下来,而门还是锁的~不必担心~门会自动打开,只要是前一个人已经不在屋子里即可~

然后再来说说这个Interlocked,官方说明是"对一个变量进行原子操作进行递增或者递减然后保存"

原子操作的概念就是,有且只有一个线程在对此变量进行操作~不准其他线程干预的操作

当对一个变量进行原子操作的时候,此变量就会加锁,而其他线程是无法访问的,只能挂起等候此变量解锁

我感觉实际上使用的也就是Mutex来实现的

好了开始说说具体的实现吧

public class MutexTest
{
private static int poolFlag = 0 ;//标记
private const int amountThread = 10 ;//线程总量
private const int maxThread = 3 ;//可执行线程最大数量
private static Mutex muxConsole = new Mutex() ;

public static void Main()
{
for ( int i = 0 ; i < amountThread ; i ++ )
{
// 创建指定数量的线程
// 是线程调用Run方法
// 启动线程
Thread trd = new Thread( new ThreadStart( Run ) ) ;
trd.Name = "线程" + i ;
trd.Start() ;
}
}

public static void Run()
{

muxConsole.WaitOne();//阻塞队列
Interlocked.Increment(ref poolFlag) ;//标记+1
if (poolFlag != maxThread) //判断是否等于上限
muxConsole.ReleaseMutex(); //如果此线程达不到可执行线程上限,则继续开通,让后面的线程进来
Console.WriteLine( "{0} 正在运行......\n", Thread.CurrentThread.Name ) ;
Thread.Sleep( 5000 ); //模拟执行
Console.WriteLine( "{0} 已经中止......\n", Thread.CurrentThread.Name ) ;

//标记-1
Interlocked.Decrement(ref poolFlag) ;
}
}

注释很全,大家慢慢看吧~我准备把这个用到WebService的负载平衡上面~

这样我就可以自己控制请求的数量了~

分享到:
评论

相关推荐

    c#高效的线程安全队列ConcurrentQueueT的实现

    缺点是当队列空间不足会进行扩容,扩容的主要实现是开辟一个原始长度2倍的新数组,然后将原始数组里面的数据复制到新数组中,所以当扩容时就会产生不小的内存开销,在并发的环境中对性能的影响不可小视。当然在调用Q

    c# 线程安全队列的用法原理及使用示例

    在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 在多线程并行的情况下会出现共享数据会线程间读取与写入不一直的情况...

    C#的日志类,支持多线程调用

    一个C#的日志类,支持多线程调用 经过10000线程并发测试未发现问题

    C# UDP多线程发送接收

    通过多线程的方式实现了UDP收发数据 可以快速学习UDP通讯原理应进行实际应用

    C# Socket 客户端服务端封装 支持多连接处理 Tasks多线程 队列处理 大数据拆分包处理

    Socket 客户端代码封装、服务端代码封装,让使用Socket更简单。 同时服务端支持超过客户端连接(测试超过1万个同时连接稳定运行),Tasks多线程 队列处理 大数据拆分包处理

    多线程并发处理的简单实现

    使用队列做缓冲池,通过工作者线程来处理并任务,实现线程空闲时阻塞,有任务令牌时回复服务。

    C#.NET多线程实例25个,文档6篇

    C#.NET多线程实例25个,文档6篇

    C#实现多线程写入同一个文件的方法

    本文实例讲述了C#实现多线程写入同一个文件的方法。分享给大家供大家参考。具体实现方法如下: namespace WfpApp { public partial class Form2 : Form { object obj = new object(); public Form2() { ...

    可同时搜索多个文件的多线程快速搜索源码

    3、设计思想的核心是:构建一个临时路径队列,每一个线程在枚举文件夹内容的过程中,发现一个新的文件夹,即向队列投递该路径,64个工作线程则根据调度从队列中提取路径进行新的搜索; 4、如果需要搜索文件时的相对...

    C#实现控制线程池最大数并发线程

    并非逻辑线程越多也好,而且新的逻辑线程必须会在线程池的等待队列中等待 ,直到线程池中工作的线程执行完毕, 才会有系统线程取出等待队列中的逻辑线程,进行CPU运算。 2. 解决问题:  如果不考虑服务器实际可...

    C#使用消息队列,包括远程访问

    但考虑到客户端是每隔一个很短的时间周期向服务器发送信息,并且连接客服端数量比较多的时候,担心会产生并发访问的问题,也希望避免 数据转发服务器 频繁地从多个不同线程获取信息而出现其他未知问题,所以在处理...

    基于C#的游戏服务器后台.zip

    以下是一个概述,涵盖了从架构设计、性能优化到故障处理等方面的考虑: 架构设计 多线程/异步编程: C#提供了丰富的并发编程模型,如Task、async/await关键字以及ThreadPool,用于处理并发客户端连接、非阻塞I/O...

    C#编程经验技巧宝典

    72 &lt;br&gt;0102 将字符串首字母转换大写 72 &lt;br&gt;0103 如何进行字节数组和字符串的相互转换 72 &lt;br&gt;0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73 &lt;br&gt;4.2 获取字符串信息 73 ...

    C#并发编程入门教程之概述

    并发编程一直都存在,只不过过去的很长时间里,比较难以实现,随着互联网的发展,人口红利的释放,更加友好的支持并发编程已经成了主流编程语言的标配,而对于软件开发人员来说,没有玩过并发编程都会有点不好意思。...

    ASP.NET Core 3.x 并发限制的实现代码

    我们日常开发中可能常做的给某web服务器配置连接数以及,请求队列大小,那么今天我们看看如何在通过中间件形式实现一个并发量以及队列长度限制. Queue策略 添加Nuget Install-Package Microsoft.AspNetCore....

Global site tag (gtag.js) - Google Analytics