请说明信号量在多线程编程中的作⽤,并解释如何使⽤信号量进⾏线程同步

什么是信号量(Semaphore)?

信号量是一种用于线程同步的机制,允许多个线程同时访问一定数量的共享资源。信号量通过计数器来控制线程的访问量。

  • 计数器含义:
    信号量的计数器表示可以被线程访问的共享资源数量:
    • 当一个线程获取信号量时,计数器减 1。
    • 当线程释放信号量时,计数器加 1。
  • 信号量种类:
    • 二进制信号量(Binary Semaphore): 计数器只有 0 和 1,类似于互斥锁。
    • 计数信号量(Counting Semaphore): 计数器可以是任意非负值,用于限制对资源的并发访问。

信号量的作用

  1. 控制访问数量:
    限制对共享资源的并发访问。例如,控制线程池的最大线程数、限制数据库连接的最大并发数等。

  2. 实现同步:
    在线程间传递信号,确保某些操作完成后再执行后续操作。


如何使用信号量实现线程同步?

在 C# 中,信号量可以通过 SemaphoreSemaphoreSlim 类实现:

  • Semaphore: 用于跨进程的信号量,较为重型。
  • SemaphoreSlim: 仅适用于进程内的轻量级信号量,推荐用于大多数场景。
代码示例:限制线程访问共享资源

以下示例展示如何使用 SemaphoreSlim 限制线程并发访问共享资源的数量。

using System;
using System.Threading;

class Program
{
    private static SemaphoreSlim semaphore = new SemaphoreSlim(3); // 最大并发线程数为 3

    static void AccessResource(int threadNumber)
    {
        Console.WriteLine($"Thread {threadNumber} is waiting to access the resource...");
        semaphore.Wait(); // 获取信号量
        try
        {
            Console.WriteLine($"Thread {threadNumber} is accessing the resource.");
            Thread.Sleep(2000); // 模拟资源访问
        }
        finally
        {
            Console.WriteLine($"Thread {threadNumber} has released the resource.");
            semaphore.Release(); // 释放信号量
        }
    }

    static void Main(string[] args)
    {
        for (int i = 1; i <= 10; i++)
        {
            int threadNumber = i;
            new Thread(() => AccessResource(threadNumber)).Start();
        }

        Console.ReadLine();
    }
}

代码解析

  1. 创建信号量:

    private static SemaphoreSlim semaphore = new SemaphoreSlim(3);
    

    SemaphoreSlim(3) 指定信号量的初始计数为 3,表示最多允许 3 个线程同时访问资源。

  2. 获取信号量:

    semaphore.Wait();
    

    线程调用 Wait() 时,会尝试获取信号量:

    • 如果信号量计数器大于 0,则计数器减 1,线程进入临界区。
    • 如果计数器为 0,则线程阻塞等待。
  3. 释放信号量:

    semaphore.Release();
    

    线程完成任务后调用 Release(),信号量计数器加 1,其他等待的线程可以继续运行。

  4. 并发限制:
    即使我们创建了 10 个线程,但同时最多只有 3 个线程可以访问资源,其他线程需要等待。


信号量的应用场景

  1. 数据库连接池: 限制同时连接到数据库的客户端数量。
  2. 线程池管理: 控制线程池中同时运行的任务数量。
  3. 文件访问: 防止多个线程同时写入文件导致数据不一致。
  4. 资源分配: 如网络连接或硬件资源的限量使用。

小结

  • 信号量的核心作用是控制对共享资源的并发访问。
  • SemaphoreSlim 是轻量级的信号量实现,推荐用于进程内的线程同步。
  • 在多线程编程中,信号量可以有效避免资源争用问题,同时灵活控制线程的并发量,提升程序稳定性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面试八股文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值