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

    则结果为:

  • 相关阅读:
    java map使用比较
    mysql无法启动问题 Found option without preceding group in config file
    B站freecoder的计算机基础讲解
    周问题记录
    使用baksmali及smali修改apk并打包
    安卓APP动态调试-IDA实用攻略
    IDA远程调试 在内存中dump Dex文件
    关于ARM的B,BL跳转指令
    IDA 远程调试 Android so
    IDA远程调试so库JNI_Onload函数
  • 原文地址:https://www.cnblogs.com/Finding2013/p/3012548.html
Copyright © 2011-2022 走看看