C# semphore的使用
”信号量非常类似于互斥,信号量可以同时由多个线程使用。
信号量是一种计数的互斥锁定,可以定义允许同时访问受旗语锁定保护的资源的线程个数。
如果需要限制可用资源的线程数,信号量就非常有用。例如,如果系统有3个物理端口可用,就允许3个线程同时访问I/O端口,但第4个线程就需要等待前3个线程中的一个释放资源。
.NET4.5位信号量功能提供了两个类Semphore和SemphoreSlim。Semphore类可以命名,使用系统内的资源,允许在不同进程之间同步。SemphoreSlim类对较短等待时间进行了优化的轻型版本。”
using System;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Threading; namespace UnitTest
{
class Program
{
static void Main(string[] args)
{
int taskCount = ;
int semaphoreCount = ;
var semaphore = new SemaphoreSlim(,);
var tasks = new Task[taskCount]; for (int i = ; i < taskCount; i++)
{ tasks[i] = Task.Factory.StartNew(()=>TaskMain(semaphore));
} Task.WaitAll(tasks); Console.ReadLine();
} static void TaskMain(SemaphoreSlim semaphore)
{
bool isCompleted = false;
while (!isCompleted)
{
if (semaphore.Wait())
{
try
{
Console.WriteLine("Task {0} locks ths semphore {1}", Task.CurrentId,DateTime.Now.ToString(" HH:mm:ss.ffff")+" "+Task.CurrentId); Thread.Sleep();
}
finally
{
Console.WriteLine("Task {0} release the semphoreb {1}", Task.CurrentId,DateTime.Now.ToString(" HH:mm:ss.ffff"));
semaphore.Release();
isCompleted = true;
}
}
else
{
Console.WriteLine("Timeout for task {0};wait again {1}",Task.CurrentId,DateTime.Now.ToString(" HH:mm:ss.ffff")); }
}
}
}
}

参考:《C#高级编程》(第9版)P593
C# semphore的使用的更多相关文章
- java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
线程同步辅助类,主要学习两点: 1.上述几种同步辅助类的作用以及常用的方法 2.适用场景,如果有适当的场景可以用到,那无疑是最好的 semaphore(seməˌfôr) 含义 信号量就是可以声明多把 ...
- Java并发编程的4个同步辅助类(CountDownLatch、CyclicBarrier、Semphore、Phaser)
我在<jdk1.5引入的concurrent包>中,曾经介绍过CountDownLatch.CyclicBarrier两个类,还给出了CountDownLatch的演示案例.这里再系统总结 ...
- 并发工具类(三)控制并发线程的数量 Semphore
前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...
- Semphore信号量的使用
前言:在多线程环境的同步中,我们为了让每个线程具有同步的作用,经常采用synchronize.reetrantlock等同步手段进行上锁,以便在同一时间只能有一个线程具有访问变量和读写变量的权力.然而 ...
- [CareerCup] 16.5 Semphore 信号旗
16.5 Suppose we have the following code:public class Foo { public Foo() { . . . } public void first( ...
- Linux进程通信 之 信号灯(semphore)(System V && POSIX)
一. 信号灯简介 信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制. 相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程 也可以修改该标志.除了用于访 ...
- Linux系统中的信号量(semphore)与互斥体(mutex)
http://www.embexperts.com/viewthread.php?tid=31 两者最大区别:信号量可以允许多个线程进入临界区,而互斥体只允许一个线程进入临界区.本贴将描述信号量与互斥 ...
- Java 程序员们值得一看的好书推荐
"学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一 ...
- 【转】成为Java顶尖程序员 ,看这10本书就够了
“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超 ...
随机推荐
- liunx必知必会(2)
一.SSH免密登陆配置 1.相关概念 SSH 为 Secure Shell(安全外壳协议) 的缩写. 很多ftp.pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用 ...
- HTML中 等6种空白空格的区别
HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格( )在不同浏览器中宽度各异. 它 ...
- u-boot移植(九)---代码修改---NAND
一.NAND原理 NAND 无地址空间,地址和数据的发送都依赖于LDATA[0:7]这一串数据总线. 不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K + 64 个byt ...
- C# Regex正则常用方法的使用
using System; using System.Collections; using System.Configuration; using System.Data; using System. ...
- window系列
1.关闭浏览器单个网页 ctrl+W 2.远程桌面连接 mstsc
- python3爬虫一
1.环境安装: 在py3env(虚拟环境)下安装scrapy,新建项目: pip install scrapy scrapy startproject ArticleSpider cd Article ...
- ubuntu下安装搜狗输入法以及出现不能输入中文的解决办法
1. 官网下载安装包 http://pinyin.sogou.com/linux/?r=pinyin 下载你需要的版本,这里选择64位版. 2. 进入软件中心安装 3. 修改ibus为fcitx im ...
- C++ 中的指针、引用以及函数调用中的问题
参考链接:https://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html 函数传参的方式有三种: (1)值传递: (2)引用传递 ...
- WDS 三种模式
(1)懒人模式(Lazy mode) 此模式下不需要填写对端的BSSID,本端AP的WDS连接作为被动连接,只需要对端填写了本端AP的BSSID即可,效果和桥接模式一样. (2)桥接模式(Bridge ...
- Maven编译时,出现找不到符号
解决办法: 如果使用的是聚合工程 1.执行project--clean(eclipse)或者build project(intellij),将项目清理一下. 2.执行聚合工程中的 Maven--cl ...