• C# 多线程之信号量Semaphore


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

    Semaphore的理解

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

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

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

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

     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();
                 }
             }
           
         }
       

    程序执行结果为:

  • 相关阅读:
    c++ 文件读写模板
    sys和system用户的权限区别
    Oracle cmd 命令
    sqldeveloper的安装及其使用教程
    Oracle权限管理详解(2)
    Oracle权限管理详解(1)
    Oracle使用基础
    win7 64位操作系统中 Oracle 11g 安装教程(图解)
    MySQL cmd操作
    Linux下安装tomcat
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2854489.html
Copyright © 2020-2023  润新知