zoukankan      html  css  js  c++  java
  • C# 多线程之一:信号量Semaphore

    通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小

    访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Semaphore的许可证计数器相应的减一,当计数器为0时,其他申请该信号量许可证的线程将被堵赛,直到先前已经申请到许可证的线程释放他占用的许可证让计数器加一,这样最近去申请许可证的线程将会得到竞争得到被释放的许可证。

    常见的操作方法 WaitOne():申请一个许可证  Release():释放占用的许可证

    具体使用看下面的示例代码:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading;
     6  
     7 namespace MutiThread
     8 {
     9     /// <summary>
    10     /// .net 信号量Semaphore的使用
    11     /// </summary>
    12     class Program
    13     {
    14         static void Main(string[] args)
    15         {
    16             //初始化4个线程
    17             Mythread mythrd1 = new Mythread("Thrd #1");
    18             Mythread mythrd2 = new Mythread("Thrd #2");
    19             Mythread mythrd3 = new Mythread("Thrd #3");
    20             Mythread mythrd4 = new Mythread("Thrd #4");
    21  
    22             //Join()方法阻塞调用线程 
    23             //达到主线程在4个子线程执行完毕才退出的目的
    24             mythrd1.thrd.Join();
    25             mythrd2.thrd.Join();
    26             mythrd3.thrd.Join();
    27             mythrd4.thrd.Join();
    28  
    29         }
    30     }
    31  
    32     /// <summary>
    33     /// 封装线程类
    34     /// </summary>
    35     class Mythread
    36     {
    37         public Thread thrd;
    38         //创建一个可授权2个许可证的信号量,且初始值为2
    39         static Semaphore sem = new Semaphore(2, 2);
    40  
    41         public Mythread(string name)
    42         {
    43             thrd = new Thread(this.run);
    44             thrd.Name = name;
    45             thrd.Start();
    46         }
    47  
    48         void run()
    49         {
    50             Console.WriteLine(thrd.Name + "正在等待一个许可证……");
    51             //申请一个许可证
    52             sem.WaitOne();
    53             Console.WriteLine(thrd.Name + "申请到许可证……");
    54             for (int i = 0; i < 4; i++)
    55             {
    56                 Console.WriteLine(thrd.Name + "" + i);
    57                 Thread.Sleep(1000);
    58             }
    59             Console.WriteLine(thrd.Name + " 释放许可证……");
    60             //释放许可证
    61             sem.Release();
    62         }
    63     }
    64  
    65 }

    结果

  • 相关阅读:
    FullCalendar日历插件说明文档
    Git忽略规则及.gitignore规则不生效的解决办法
    学习git config配置文件
    拼接最长回文串
    Gildong owns a bulgogi restaurant
    前m大的数
    求水洼(dfs)
    循环数组的最大子段和
    求叶子节点
    周期
  • 原文地址:https://www.cnblogs.com/xxaxx/p/3879536.html
Copyright © 2011-2022 走看看