zoukankan      html  css  js  c++  java
  • 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());
    }

    }
    }

  • 相关阅读:
    Weblogic学习笔记
    Shiro权限使用
    Shiro权限框架使用总结
    支付宝接口文档说明
    代码模拟实现十六进制转二进制
    代码模拟实现十六进制转换十进制
    四种内部类详细解释和代码示例
    Struts2_struts.xml写法和用法例子
    spring一些方法和用法例子
    Hibernate一些_方法_@注解_代码示例
  • 原文地址:https://www.cnblogs.com/LinFx/p/2123669.html
Copyright © 2011-2022 走看看