关闭

Semaphore(信号量)

标签: 多线程C#.net
319人阅读 评论(0) 收藏 举报
分类:

信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量。

那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0。这时,如果有另一个线程继续调用这个Semaphore,那么这个线程就会被阻塞。

获得Semaphore的线程处理完它的逻辑之后,你就可以调用它的Release()函数将它的计数器重新加1,这样其它被阻塞的线程就可以得到调用了。

 

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Semaphore1
{
class Program
{
//我设置一个最大允许5个线程允许的信号量
//并将它的计数器的初始值设为0
//这就是说除了调用该信号量的线程都将被阻塞
static Semaphore semaphore = new Semaphore(0, 5);

static void Main(string[] args)
{
for (int i = 1; i <= 5; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(work));

thread.Start(i);
}

Thread.Sleep(1000);
Console.WriteLine("Main thread over!");

//释放信号量,将初始值设回5,你可以将
//将这个函数看成你给它传的是多少值,计数器
//就会加多少回去,Release()相当于是Release(1)
semaphore.Release(5);
}

static void work(object obj)
{
semaphore.WaitOne();

Console.WriteLine("Thread {0} start!",obj);

semaphore.Release();
}
}
}
复制代码

 

结果如下图所示,其它的线程只有等到主线程释放才会执行,因为我给信号量计数器的初始值是0,所以其它线程在主线程释放前都会被阻塞。而后,我在主线程直接用Release()函数将计数器置为5,所以5个线程可以同时得到执行。

image

 

另外,可以给信号量设置一个名称,这个名称是操作系统可见的,因此,可以使用这些信号量来协调跨进程边界的资源使用。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Semaphore2
{
class Program
{
static void Main(string[] args)
{
Semaphore seamphore = new Semaphore(5, 5, "SemaphoreExample");

seamphore.WaitOne();
Console.WriteLine("Seamphore 1");
seamphore.WaitOne();
Console.WriteLine("Seamphore 2");
seamphore.WaitOne();
Console.WriteLine("Seamphore 3");

Console.ReadLine();
seamphore.Release(3);
}
}
}
复制代码

 

运行两个这样的程序,你讲看到这样的结果,在第二个运行的示例中,会将线程阻塞在第三个信号量上。

image

 

转载自:http://www.cnblogs.com/heqichang/archive/2011/12/24/2300301.html

0
0
查看评论

c++11中信号量(semaphore)的实现

c++11中有 mutex (互斥量),有 condition_variable (条件变量),并没有 semaphore (信号量)。信号量,操作系统中一般都有提,后来 google 说可以使用 mutex+condition_variable 实现一个,后来写来写去,都死锁 (deadlock)...
  • ElisonWu
  • ElisonWu
  • 2014-02-28 16:45
  • 5148

Java中的信号量Semaphore

参考资料: 1. http://blog.csdn.net/zmx729618/article/details/51593666 2. jdk官方文档java提供了一个类Semaphore来实现信号量,概念上讲,一个信号量相当于持有一些许可(permits),线程可以调用Semaphore对象的...
  • zlp1992
  • zlp1992
  • 2016-09-30 10:10
  • 2138

Java中Semaphore(信号量)的使用

Semaphore的作用:在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如...
  • zbc1090549839
  • zbc1090549839
  • 2016-11-29 10:30
  • 7187

用条件变量(Condition Variable)实现信号量(Semaphore)

用条件变量(Condition Variable)实现信号量(Semaphore), 主要是通过条件变量控制资源数的加减操作,在这里定义sem_t 为     struct sem{       ...
  • jungxiangyi
  • jungxiangyi
  • 2012-10-08 18:01
  • 1354

C++多线程同步之Semaphore(信号量)

一、线程间同步的几种方式从上篇博文中可以发现,当多个线程对同一资源进行使用时,会产生“争夺”的情况,为了避免这种情况的产生,也就出现了线程间的同步这个技术。线程间的同步有多种方式,在接下来的博文中我会依次介绍几种主流的同步方式,以及他们之间的区别。在本篇博文中将介绍使用信号量Semaphore达到线...
  • oLanSeFengYe1
  • oLanSeFengYe1
  • 2016-10-24 16:06
  • 1448

比较ReentrantLock和synchronized和信号量Semaphore实现的同步性能

为了比较一下ReentrantLock和synchronized的性能,做了一下性能测试: public class ReentreLockTest { private static long COUNT = 1000000; private static Lock lock ...
  • arkblue
  • arkblue
  • 2011-01-14 14:21
  • 6906

java中的信号量semaphore实现生产者消费者模式

Semaphore 信号量,就是一个允许实现设置好的令牌。也许有1个,也许有10个或更多。  谁拿到令牌(acquire)就可以去执行了,如果没有令牌则需要等待。  执行完毕,一定要归还(release)令牌,否则令牌会被很快用光,别的线程就无法获得令牌而执行下去了。 ...
  • mm_bit
  • mm_bit
  • 2015-11-24 11:59
  • 2397

android 驱动中的并发和竞争——semaphore(信号量)

在现代的Linux系统中,有非常多的并发源,因此而带来竞争情况,竞争来源于不同的进程对同一共享资源的同时存取。而Linux系统提供了一系列的处理并发和资源竞争的方法,下面介绍几个: 1、semaphore(信号量) 信号量的使用类似于一对P、V函数,通常一个想进入临界区的进程会调用P函数,返回值是可...
  • mengluoxixiang
  • mengluoxixiang
  • 2015-05-27 10:08
  • 996

进程间通信之-信号量semaphore--linux内核剖析(十)

信号量什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。 信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们...
  • gatieme
  • gatieme
  • 2016-03-28 23:37
  • 6478

多线程同步-信号量(深入理解Semaphore)

多线程同步之Semaphore (主要解决生产者消费者问题) 一 信标Semaphore 信标内核对象用于对资源进行计数。它们与所有内核对象一样,包含一个使用数量,但是它们也包含另外两个带符号的3 2位值,一个是最大资源数量,一个是当前资源数量。最大资源数量用于标识信标能够控制的资源的最大数...
  • zhang_sinner
  • zhang_sinner
  • 2015-02-11 21:43
  • 926
    个人资料
    • 访问:1456次
    • 积分:59
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类