学习来源:《.net core 底层入门》 第六章第9节:信号量
案例:主线程负责添加数据,子线程负责获取数据
使用SemaphoreSlim(轻信号量)实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 测试信号量
{
internal class Program
{
private static SemaphoreSlim _semaphore = new SemaphoreSlim(4);
public static Queue<int> _queue = new Queue<int>();
public static object _lock = new object();
static void Main(string[] args)
{
Thread thread = new Thread(work);
thread.IsBackground = true;
thread.Start();
int job = 0;
while (true) {
lock (_lock) {
_queue.Enqueue(job++);
}
//释放对象指定次数
_semaphore.Release(1);
Thread.Sleep(1000);
}
}
public static void work() {
while (true) {
//阻止当前线程,直至释放
_semaphore.Wait();
lock (_lock)
{
if (_queue.Count > 0)
{
Console.WriteLine(_queue.Dequeue());
}
}
Thread.Sleep(1000);
}
}
}
}
使用Monitor实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 测试信号量
{
internal class Program
{
public static Queue<int> _queue = new Queue<int>();
public static object _lock = new object();
static void Main(string[] args)
{
Thread thread = new Thread(work);
thread.IsBackground = true;
thread.Start();
int job = 0;
while (true) {
lock (_lock) {
_queue.Enqueue(job++);
//通知等待队列中的线程锁对象状态变更
Monitor.Pulse(_lock);
}
Thread.Sleep(1000);
}
}
public static void work() {
while (true) {
lock (_lock)
{
if (_queue.Count > 0)
{
Console.WriteLine(_queue.Dequeue());
}
else {
//释放对象上的锁并且阻止当前线程,直到他状态变更
Monitor.Wait(_lock);
}
}
Thread.Sleep(1000);
}
}
}
}