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

    Semaphore的理解

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

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

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

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

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

    程序执行结果为:

    test


  • 相关阅读:
    【Python】自己写日志功能
    shell 笔记
    python 字典,字典嵌套,字典遍历
    python基础 循环,列表,切片,列表增删改查
    Dva_react使用问题总结
    ts_react_test报错解决方法
    如何写好项目规划和方案设计文档 (转)
    script标签引入react环境三个必须cdn文件
    react点击事件对象( react封装过后事件对象 )
    react简书笔记一 环境, git 和 项目 关联
  • 原文地址:https://www.cnblogs.com/kevinGao/p/2305560.html
Copyright © 2011-2022 走看看