C# 线程同步 信号量 Semaphore
Semaphore 信号量, 用来限制可同时访问某一资源或资源池的线程数。
信号量维护了一个计数器, 计数器的值可以在0到指定的最大值之间。
当一个线程完成了对信号量的等待后, 信号量计数器值减少。
当一个线程稀放信号量时, 信号量计数器值增加。
当计数器值达到零后,信号量是"未标志的",当计数器值大于零时, 信号量是"标志的"。
任何线程都无法等待信号量变为"标志的", 因此信号量对限制可以共享数据的线程数量很有用处。
using System;using System.Collections.Generic;using System.Text;using System.Threading; namespace ConsoleApplication1{class Program {static Semaphore hSemaphore;//static Thread[] hThread; static int source = 0; static void Main(string[] args) { hSemaphore = new Semaphore(1, 3); Thread[] hThread = new Thread[4];for (int i = 0; i < 4; i++) { hThread[i] = new Thread(new ThreadStart(Proc)); hThread[i].Name = string.Format("线程{0}", i + 1); hThread[i].Start();//Thread t = new Thread(new ParameterizedThreadStart(Proc));//t.Start(i); } //等待半秒直到所有线程都启动并获取信号量//Thread.Sleep(5000); for (int i = 0; i < hThread.Length; i++) { hThread[i].Join(); } //释放信号量//hSemaphore.Release(5); Console.ReadKey(); } static void Proc() { Console.WriteLine("{0} 开始等待信号量, 请求资源", Thread.CurrentThread.Name); hSemaphore.WaitOne(); Console.WriteLine("{0} 已经进入信号量, --使用资源--", Thread.CurrentThread.Name); source++; int p = Interlocked.Add(ref source, 100); Thread.Sleep(1000 + p); Console.WriteLine("{0} 已释放信号量, 原信号量数目: {1}", Thread.CurrentThread.Name, hSemaphore.Release()); } }}
转载于:https://www.cnblogs.com/LinFx/archive/2011/09/02/2123669.html
C# 线程同步 信号量 Semaphore相关推荐
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- 经典线程同步 信号量Semaphore
信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaph ...
- linux c 网络编程与信号量,linux网络编程-----线程同步--信号量
开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因:资 ...
- 线程同步-信号量-strand的用法总结
这里展示不用boost::asio::strand而是利用常规线程同步的手段来完成线程的同步. #include <iostream> #include <boost/asio.hp ...
- 线程同步--信号量内核对象
信号量同步能够很好的解决线程执行顺序. HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitia ...
- 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量
前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...
- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 秒杀多线程第七篇 经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- windows 多线程 (六) 信号量Semaphore
首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDL ...
- Linux C :线程操作和线程同步的多线程并发编程
在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...
最新文章
- 清华大学、腾讯发布新书 详解产业互联网的中国路径
- git查看各个branch之间的关系图
- 继承CListCtrl,然后重载OnLButtonUP消息,发现变成双击才触发???
- 项目中常见错误总结一
- BFS——广度优先算法(Breadth First Search)
- 转:Xcode下的GDB调试命令
- 任务管理平台_jytask一个任务调度统一管理平台
- Windows应用程序启动命令汇总
- 功能强大的TCGA再分析平台
- vue中的状态管理 vuex store
- C语言 指针与字符串
- Java设计person类,有姓名,年龄,性别。要求:该类至多只能创建一男,一女两个对象。
- springBoot整合tkMybatis
- Redis学习之hget命令
- 用qt 编译qt moc
- JMeter常用函数整理
- 最新Xpay全开源无授权免签约支付系统源码V3.1版本
- 微信小程序---搜索功能并跳转搜索结果页面
- 系统性能优化的十大策略(强烈推荐,建议收藏)
- 灵机一栋团队alpha冲刺 Ⅰ
热门文章
- MATLAB--高斯牛顿法
- 【证明】两个自变量的二阶线性方程经过可逆变换后方程的类型不会改变
- php大小写转换,php中字母大小写转换函数
- aes加密c语言实现,基于C语言实现的aes256加密算法示例
- 查看docker镜像内部端口号_Docker 安装部署
- DST(对话状态追踪)常用方法
- 使用数组初始化vector对象
- pyspark调用spark以及执行带in语句参数的hql示例
- python socket recvfrom 超时捕获_python-udp客户端超时机制
- 【机器学习系列】EM算法第三讲:由Jensen Inequality推导EM算法