松江做网站需要多少钱,百度网盘免费下载,广告投放面试,wordpress style.css修改导航菜单字体样式文章目录 简介信号量的工作原理使用场景使用示例其他使用实例1. 数据库连接池管理2. 文件读写同步3. 生产者消费者问题4. 打印任务队列同步5. Web服务器并发请求限制 简介
在C#中#xff0c;信号量#xff08;Semaphore#xff09;是.NET框架提供的一个同步类#xff0c;位… 文章目录 简介信号量的工作原理使用场景使用示例其他使用实例1. 数据库连接池管理2. 文件读写同步3. 生产者消费者问题4. 打印任务队列同步5. Web服务器并发请求限制 简介
在C#中信号量Semaphore是.NET框架提供的一个同步类位于System.Threading命名空间下用于控制并发访问特定资源的线程数量。它是一种更灵活的线程同步机制通过维护一个计数器来管理资源的可用性。
信号量的工作原理
初始化时可以指定一个初始计数值这个值表示可以同时访问共享资源的线程数。
当线程调用WaitOne()方法时如果信号量计数器大于0则计数器减1并允许线程继续执行若计数器为0则线程被阻塞并等待其他线程释放信号量。通过调用Release()方法可以增加信号量的计数值从而允许一个或多个等待中的线程获取信号量并继续执行。
使用场景
资源池管理例如限制数据库连接池中同时活动的连接数以防止过多连接导致系统过载。互斥锁Mutex替代当信号量初始化为1时它相当于一个互斥锁确保同一时间只有一个线程能访问临界区。多线程同步对于可同时由多个线程使用的有限资源如许可、通道容量等可以通过设置适当的信号量计数值来协调多个线程的并发访问。
使用示例
using System.Threading;// 创建一个最多允许5个线程同时访问的信号量
Semaphore semaphore new Semaphore(5, 5); // 第一个参数是初始信号量第二个参数是最大信号量void AccessResource()
{// 尝试获取信号量semaphore.WaitOne();try{// 这里是临界区只有拿到信号量的线程才能进入// 执行对共享资源的操作...}finally{// 资源操作完毕后释放信号量semaphore.Release();}
}// 在多个线程中调用AccessResource()函数
// ...在上述代码中Semaphore(5, 5)创建了一个信号量初始和最大并发访问数均为5。当超过5个线程尝试访问资源时额外的线程将会阻塞直到有其他线程完成操作并释放信号量。每个成功获取信号量的线程在完成资源访问后都会调用Release()将信号量递增以便后续线程继续访问。
其他使用实例
1. 数据库连接池管理
Semaphore connectionSemaphore new Semaphore(10, 10); // 最多允许10个并发连接void ExecuteQuery()
{connectionSemaphore.WaitOne();try{var connection GetDatabaseConnection(); // 获取数据库连接// 执行SQL查询...}finally{ReleaseDatabaseConnection(connection); // 释放数据库连接connectionSemaphore.Release();}
}// 多线程环境下多个线程调用ExecuteQuery()函数执行数据库操作2. 文件读写同步
Semaphore fileSemaphore new Semaphore(1, 1); // 文件操作为互斥同一时间仅允许一个线程访问void WriteToFile(string content)
{fileSemaphore.WaitOne();try{using (var writer new StreamWriter(file.txt)){writer.WriteLine(content);}}finally{fileSemaphore.Release();}
}// 多线程环境下同时写入文件但不会产生数据混乱3. 生产者消费者问题
Semaphore bufferSemaphore new Semaphore(10, 10); // 缓冲区大小为10void Producer()
{var item CreateItem();bufferSemaphore.WaitOne();try{Buffer.Add(item); // 将产品放入缓冲区}finally{bufferSemaphore.Release();}
}void Consumer()
{bufferSemaphore.WaitOne();try{var item Buffer.Take(); // 从缓冲区取出产品进行消费Consume(item);}finally{bufferSemaphore.Release();}
}// 生产者和消费者线程通过信号量控制对缓冲区的存取操作4. 打印任务队列同步
Semaphore printerSemaphore new Semaphore(1, 1); // 打印机为独占资源void PrintJob()
{printerSemaphore.WaitOne();try{SendToPrinter(JobQueue.Dequeue()); // 从打印任务队列中取出并发送打印任务}finally{printerSemaphore.Release();}
}// 多线程环境下打印机按顺序处理打印任务避免任务冲突5. Web服务器并发请求限制
Semaphore requestSemaphore new Semaphore(100, 100); // 同时处理的最大请求数为100async Task HandleHttpRequest(HttpRequest request)
{requestSemaphore.WaitOne();try{await ProcessRequestAsync(request); // 处理HTTP请求}finally{requestSemaphore.Release();}
}// Web服务器使用信号量限制同时处理的并发请求数量防止过多请求导致系统过载python推荐学习汇总连接 50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50) ————————————————
最后我们放松一下眼睛