学习来源:《.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);}}}
}