• 信号量(semaphore)支持 多并发(n>=1)同步锁


    信号量(semaphore)是内核维护的一个Int32的变量。信号量为0时,在信号量上等待的线程会阻塞;信号量大于0时,就解除阻塞。主要方法:

    Release():就是一个加1的操作

    Release(int32 releasecount):就是一个加releasecount的操作。

    初始化semaphore时,可以指定最大和最小信号量的值。

    用Sempphore实现同样功能的同步锁,如下为一个只允许1个并发入口(即1次只能有一个线程访问)的示例:

     1  public class Program
     2     {
     3         private class SimpleWaitLock : IDisposable
     4         {
     5             private Semaphore m_semaphore = new Semaphore(1, 1);
     6             
     7             
     8             public void Enter()
     9             {
    10                 m_semaphore.WaitOne();
    11                 Console.WriteLine("Thread {0} Enter;",Thread.CurrentThread.Name);
    12                 Thread.Sleep(100);
    13                 Exit();
    14             }
    15             public void Exit()
    16             {
    17                 Console.WriteLine("Thread {0} Exit;", Thread.CurrentThread.Name);
    18                 m_semaphore.Release();
    19                 
    20             }
    21             public void Dispose()
    22             {
    23                 m_semaphore.Dispose();
    24                 Console.WriteLine("Thread {0} dispose;", Thread.CurrentThread.Name);
    25             }
    26         }
    27         static void Main()
    28         {
    29             SimpleWaitLock slock = new SimpleWaitLock();
    30             for (int i = 0; i < 10; i++)
    31             {
    32                 Thread thread = new Thread(slock.Enter);
    33                 thread.Name = "thread" + i.ToString();
    34                 thread.Start();                
    35             }
    36             Console.Read();
    37         }
    38      
    39 
    40     }

    结果为:

    如将第5行改为(即允许2个并发入口):

    private Semaphore m_semaphore = new Semaphore(2, 2);

    则结果为:

  • 相关阅读:
    Linux Shell入门
    Linux系统结构
    Ubuntu bond 配置
    VXLAN概述
    lsof
    入驻博客园,希望可以跟大家一起讨论,一起学习和进步。
    版本管理工具小乌龟TortoiseGit的安装和使用(2)
    版本管理工具小乌龟TortoiseGit的安装和使用(1)
    定义变量时未初始化赋值的问题
    BlackBerry 9900刷机
  • 原文地址:https://www.cnblogs.com/Finding2013/p/3012548.html
Copyright © 2020-2023  润新知