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();
}
}
}
|
程序执行结果为:

分享到:
相关推荐
### C#中的信号量Semaphore与多线程管理 在探讨C#中的`Semaphore`类之前,我们先简单回顾一下多线程的基本概念。在计算机科学领域,多线程是指一个程序内部可以同时运行多个线程(即执行路径),每个线程都可以独立...
- `Semaphore`:信号量,限制同时访问资源的线程数量。 - `Monitor`:基于锁的对象,使用`lock`关键字实现。 - `Barrier`:屏障,用于等待一组线程到达特定点后再继续执行。 3. 线程通信: - `AutoResetEvent` ...
"10.3_C#多线程监视器程序"可能是一个示例项目,旨在教授如何在C#环境中管理和监控多个并发线程。让我们深入探讨一下这个主题,了解多线程的核心概念以及在C#中如何使用它们。 首先,多线程允许一个应用程序同时...
C#多线程是.NET框架中的一个重要特性,它允许开发者在同一时间内执行多个任务,从而提高应用程序的效率和响应性。在处理大量数据、实现并发操作或进行后台处理时,多线程技术尤其有用。本参考手册将深入探讨C#中的多...
- **Semaphore**:信号量,控制对有限资源的并发访问数量。 - **Monitor**:内置锁,基于对象的锁,用于控制对特定对象的访问。 - **lock关键字**:提供一种简单的线程同步机制,防止数据竞争。 4. **线程通信**...
- **Semaphore**:信号量,控制同时访问特定资源的线程数量。 - **Lock语句**:基于Monitor,提供简洁的锁定语法。 4. **线程同步原语**:除了上述的类,还有`WaitHandle`(如`AutoResetEvent`和`...
- `WaitHandle`(如`AutoResetEvent`, `ManualResetEvent`, `Mutex`, `Semaphore`):线程间信号量,控制线程等待或唤醒。 - `Monitor.Wait()`, `Monitor.Pulse()`: 用于线程等待和唤醒操作。 - `Channel`:C# ...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...
总结,本资料“C#多线程学习代码资料”会涵盖这些知识点,并通过示例代码帮助初学者理解多线程的创建、同步、通信以及异常处理等概念,是学习C#多线程编程的良好起点。通过深入学习和实践,开发者能够更好地掌握多...
本文将基于“C#多线程系列教程”这一主题,深入探讨多线程的基本概念、原理以及在C#中的具体应用,旨在为初学者、开发人员以及对多线程技术感兴趣的程序员提供全面、系统的知识体系。 ### C#多线程基础 #### 1. 多...
在C#编程语言中,多线程是一种强大的技术,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。多线程是现代计算环境中不可或缺的一部分,尤其是在处理大量数据、进行复杂计算或者需要实现并发操作的...
本示例中的“C#多线程实现简单的任务管理器”是一个很好的学习资源,旨在帮助初学者理解多线程的概念及其在实际应用中的运用。 1. **线程基础**: - **线程与进程**:线程是操作系统分配CPU时间的基本单元,而进程...
本文将深入探讨C#多线程编程,包括Thread类的使用以及线程同步的相关知识。 ### 1. Thread类介绍 Thread类是C#中处理线程的主要类,位于System.Threading命名空间下。通过实例化Thread类,我们可以创建新的线程并...
在C#编程中,多线程是一项核心技能,它允许开发者在同一时间执行多个任务,从而提升应用程序的效率和响应性。本资源提供的“多线程程序”是一个实践性的示例,可以帮助你深入理解和掌握C#中的多线程技术。 1. **...
1. `Semaphore(int initialCount, int maximumCount, string name = null, bool initiallyOwned = false)`: initialCount表示初始许可证数量,maximumCount是最大许可证数,name用于命名信号量以便跨进程共享,...
### C#多线程知识点详解 #### 一、多线程基本概念 在计算机科学领域,多线程是指一个程序内部同时执行多个控制流的能力。这些控制流通常被称为“线程”。多线程能够使程序在执行过程中实现并行操作,从而提高程序的...
2. `Semaphore`:信号量,控制同时访问特定资源的线程数量。 3. `Monitor`:监视器,用于保护对象的同步。 4. `lock`关键字:基于对象的锁定,防止数据竞争。 四、线程同步示例 以下是一个使用`lock`关键字的简单...
本书《C#多线程编程实战》的源代码旨在帮助开发者深入理解并实践多线程技术。以下是对源代码中涉及的关键知识点的详细解释: 1. **线程基础**: - `System.Threading.Thread`类:这是创建和管理线程的基本API。你...
以下是一些关于C#多线程串口通讯的关键知识点: 1. **System.IO.Ports命名空间**:这是C#中处理串口通信的核心,提供了SerialPort类,可以用来设置串口参数(如波特率、数据位、停止位、校验位等)以及进行读写操作...
通常,我们更倾向于使用互斥量(Mutex)、信号量(Semaphore)或 Monitor 类等同步原语来控制线程访问共享资源,而非直接挂起线程。 2. **休眠线程**: 休眠线程是让线程暂时停止执行,等待一段时间后再继续。C#...