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相关推荐

  1. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  2. 经典线程同步 信号量Semaphore

    信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDLE CreateSemaph ...

  3. linux c 网络编程与信号量,linux网络编程-----线程同步--信号量

    开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因:资 ...

  4. 线程同步-信号量-strand的用法总结

    这里展示不用boost::asio::strand而是利用常规线程同步的手段来完成线程的同步. #include <iostream> #include <boost/asio.hp ...

  5. 线程同步--信号量内核对象

    信号量同步能够很好的解决线程执行顺序. HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitia ...

  6. 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

    前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...

  7. 秒杀多线程第六篇 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  8. 秒杀多线程第七篇 经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  9. windows 多线程 (六) 信号量Semaphore

    首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使用说明. 第一个 CreateSemaphore 函数功能:创建信号量 函数原型: HANDL ...

  10. Linux C :线程操作和线程同步的多线程并发编程

    在这之前可以先看看这边文章了解线程概念,信号量,条件变量,死锁.管程等概念 https://blog.csdn.net/superSmart_Dong/article/details/11666837 ...

最新文章

  1. 清华大学、腾讯发布新书 详解产业互联网的中国路径
  2. git查看各个branch之间的关系图
  3. 继承CListCtrl,然后重载OnLButtonUP消息,发现变成双击才触发???
  4. 项目中常见错误总结一
  5. BFS——广度优先算法(Breadth First Search)
  6. 转:Xcode下的GDB调试命令
  7. 任务管理平台_jytask一个任务调度统一管理平台
  8. Windows应用程序启动命令汇总
  9. 功能强大的TCGA再分析平台
  10. vue中的状态管理 vuex store
  11. C语言 指针与字符串
  12. Java设计person类,有姓名,年龄,性别。要求:该类至多只能创建一男,一女两个对象。
  13. springBoot整合tkMybatis
  14. Redis学习之hget命令
  15. 用qt 编译qt moc
  16. JMeter常用函数整理
  17. 最新Xpay全开源无授权免签约支付系统源码V3.1版本
  18. 微信小程序---搜索功能并跳转搜索结果页面
  19. 系统性能优化的十大策略(强烈推荐,建议收藏)
  20. 灵机一栋团队alpha冲刺 Ⅰ

热门文章

  1. MATLAB--高斯牛顿法
  2. 【证明】两个自变量的二阶线性方程经过可逆变换后方程的类型不会改变
  3. php大小写转换,php中字母大小写转换函数
  4. aes加密c语言实现,基于C语言实现的aes256加密算法示例
  5. 查看docker镜像内部端口号_Docker 安装部署
  6. DST(对话状态追踪)常用方法
  7. 使用数组初始化vector对象
  8. pyspark调用spark以及执行带in语句参数的hql示例
  9. python socket recvfrom 超时捕获_python-udp客户端超时机制
  10. 【机器学习系列】EM算法第三讲:由Jensen Inequality推导EM算法