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)
{
Mythread mythrd1 =
new Mythread( "Thrd #1" );
Mythread mythrd2 =
new Mythread( "Thrd #2" );
Mythread mythrd3 =
new Mythread( "Thrd #3" );
Mythread mythrd4 =
new Mythread( "Thrd #4" );
mythrd1.thrd.Join();
mythrd2.thrd.Join();
mythrd3.thrd.Join();
mythrd4.thrd.Join();
}
}
/// <summary>
/// 封装线程类
/// </summary>
class
Mythread
{
public
Thread thrd;
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();
}
}
}
|
程序执行结果为:
分享到:
相关推荐
a: 创建一个线程 b: 创建多个线程 c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 ...I: 信号量 semaphore 解决线程同步问题
JAVA多线程--信号量(Semaphore)_.docx
使用信号量(Semaphore)实现线程的同步
多线程编程:信号量使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
Semaphore,是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。
主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下
多线程同时运行,能提高程序的运行效率,但是并非线程越多越好,而semaphore信号量可以通过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自动减一,线程结束(释放信号量)内置计数器会自动...
Semaphore:可理解为允许线程执行信号的池子,池子中放入多少个信号就允许多少线程同时执行。 private static void MultiThreadSynergicWithSemaphore() { //0表示创建Semaphore时,拥有可用信号量数值 //1表示...
难堪的一次面试: 信号量Semaphore了解过吗?没有
C#语言Semaphore类用法实例,多线程 用于有多个同类型共享资源(比如端口)时,如何协调端口分配给线程访问资源的问题,是一个简单模拟实例(源代码)。
多线程(C++)同步Semaphore
一个受SBCL信号量启发的波尔多线程的简单信号量类。 过时的! 从0.8.6版本开始,bordeaux-threads有其自己的内置信号量,因此您绝对应该使用它代替bt-semaphore。 安装 bt-semaphore可通过。 如果您好奇,还可以...
信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问 (临界资源指同一时刻只能有有限个访问),常用于协助一组相互竞争的任务来访问临界资源。运行机制可以理解为:信号量是...
Delphi多线程之Semaphore_(信号对象).pdf
一、多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源。大部分情况都推荐使用多进程。 python的多线程的同步与其他语言基本相同,主要...
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
semaphore控制多线程循序执行,网上 找的例子更改的希望对大家有用
信号量(Semaphore)哲学家进餐问题(the dining philosophers problem)---------------------------程序