《C#多线程编程实战(原书第2版)》——2.4 使用SemaphoreSlim类

本节书摘来自华章出版社《C#多线程编程实战(原书第2版)》一书中的第2章,第2.4节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 使用SemaphoreSlim类

本节将展示SemaphoreSlim类是如何作为Semaphore类的轻量级版本的。该类限制了同时访问同一个资源的线程数量。

2.4.1 准备工作

为了学习本节,你需要安装Visual Studio 2015。除此之外无需其他准备。本节的源代码放置在BookSamplesChapter2Recipe3目录中。

2.4.2 实现方式

请执行以下步骤来了解如何借助SemaphoreSlim类来限制访问同一个资源的线程数量:

1.启动Visual Studio 2015。新建一个C#控制台应用程序项目。

2.在Program.cs文件中加入以下using指令:


cd8695b73cf1e58062b7417e1d2fc193999e67ee

3.在Main方法下面加入以下代码片段:


《C#多线程编程实战(原书第2版)》——2.4 使用SemaphoreSlim类_第1张图片

4.在Main方法中加入以下代码片段:


《C#多线程编程实战(原书第2版)》——2.4 使用SemaphoreSlim类_第2张图片

5.运行程序。

2.4.3 工作原理

当主程序启动时,创建了SemaphoreSlim的一个实例,并在其构造函数中指定允许的并发线程数量。然后启动了6个不同名称和不同初始运行时间的线程。

每个线程都尝试获取数据库的访问,但是我们借助于信号系统限制了访问数据库的并发数为4个线程。当有4个线程获取了数据库的访问后,其他两个线程需要等待,直到之前线程中的某一个完成工作并调用_semaphore.Release方法来发出信号。

2.4.4 更多信息

这里我们使用了混合模式,其允许我们在等待时间很短的情况下无需使用上下文切换。然而,有一个叫作Semaphore的SemaphoreSlim类的老版本。该版本使用纯粹的内核时间(kernel-time)方式。一般没必要使用它,除非是非常重要的场景。我们可以创建一个具名的semaphore,就像一个具名的mutex一样,从而在不同的程序中同步线程。SemaphoreSlim并不使用Windows内核信号量,而且也不支持进程间同步。所以在跨程序同步的场景下可以使用Semaphore。

你可能感兴趣的:(《C#多线程编程实战(原书第2版)》——2.4 使用SemaphoreSlim类)