【深度好文】多线程之WaitHandle-->派生-》Semaphore信号量构造
Semaphore 继承自WaitHandle。
信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量。
//创建一个限制资源类
//资源数为5,开放资源数为2
//主线程自动占有3个资源
semaphore = new Semaphore(2, 5);
那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了 这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0。这时,如果有另一个线程继续调用这个Semaphore,那么这个线程就 会被阻塞(计数器都被WaitOne()方法调用每次减1 减完了)。
获得Semaphore的线程处理完它的逻辑之后,你就可以调用它的Release()或Release(1)函数将它的计数器重新加1,这样其它被阻塞的线程就可以得到调用了。
Full codes:
class SemaphoreDemo
{ static Semaphore semaphore; static void Main(string[] args)
{
//创建一个限制资源类
//资源数为5,开放资源数为2
//主线程自动占有3个资源
semaphore = new Semaphore(, ); //开启3个线程,让它们竞争剩余的2个资源
for (int i = ; i < ; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(WorkerProc));
t.Name = "Thread" + i;
t.Start(t.Name);
} System.Console.ReadKey();
} static void WorkerProc(Object obj)
{
Console.WriteLine(string.Format("线程:{0}准备执行",obj));
semaphore.WaitOne();
Console.WriteLine(string.Format("线程:{0}开始执行了,停留5秒钟", obj));
Thread.Sleep();
Console.WriteLine(string.Format("线程:{0}执行结束了,释放信号量", obj));
semaphore.Release();
}
【深度好文】多线程之WaitHandle-->派生-》Semaphore信号量构造的更多相关文章
- 【深度好文】多线程之WaitHandle-->派生-》Mutex信号量构造
bool flag = false; System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- iOS多线程之8.NSOPeration的其他用法
本文主要对NSOPeration的一些重点属性和方法做出介绍,以便大家可以更好的使用NSOPeration. 1.添加依赖 - (void)addDependency:(NSOperation * ...
- python 线程之 threading(四)
python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...
- python 线程之 threading(三)
python 线程之 threading(一)http://www.cnblogs.com/someoneHan/p/6204640.html python 线程之 threading(二)http: ...
- python 线程之_thread
python 线程之_thread _thread module: 基本用法: def child(tid): print("hello from child",tid) _thr ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
- 【C#】线程之Parallel
在一些常见的编程情形中,使用任务也许能提升性能.为了简化变成,静态类System.Threading.Tasks.Parallel封装了这些常见的情形,它内部使用Task对象. Parallel.Fo ...
- iOS多线程之GCD小记
iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...
随机推荐
- 使用alter database datafile 'XXX' offline drop 是否能够恢复(非归档模式下)
今天在群里面听到一位网友在说使用了alter database datafile 'XXX' offline drop命令是否能够恢复数据,在非归档模式下,下面是用一个实验来验证一下 ######## ...
- MySQL 序列 AUTO_INCREMENT
MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列 ...
- python3中reduce()函数的使用方法示例
reduce() 函数会对参数序列中元素进行累积,下面这篇文章主要给大家介绍了关于python中reduce()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学 ...
- 超全整理!Linux性能分析工具汇总合集
转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
- express无中间件的增删改查
index.js const express = require("express");导入express框架 const data = require("./data& ...
- OpenACC 梯度下降法求解线性方程的优化
▶ 书上第二章,用一系列步骤优化梯度下降法解线性方程组.才发现 PGI community 编译器不支持 Windows 下的 C++ 编译(有 pgCC 命令但是不支持 .cpp 文件,要专业版才支 ...
- 为挂载到/home的RAID磁盘组扩容
公司一台DELL服务器,安装的Ubuntu16.04系统,原来是6块1.2T的SAS盘做RAID-5挂载到/home,现在/home空间不够用了,需要扩容,再增加2块1.2T的盘.整个操作不复杂,但有 ...
- leetcode35
public class Solution { public int SearchInsert(int[] nums, int target) { ; i < nums.Length; i++) ...
- sts安装出现could not find jar:file解决办法
转自:https://blog.csdn.net/weixin_43702329/article/details/84823912 标题sts插件下载好但是安装出错 我的eclipse是4.5.2,在 ...
- Spring boot&Mybatis 启动报错 Failed to auto-configure a DataSource
*************************** APPLICATION FAILED TO START *************************** Description: Fai ...