C# 多线程实现
1.lock 关键字:
用于确保在线程间访问共享数据时的同步,防止多个线程同时修改数据。
示例:lock(syncObject) { /* 访问共享数据 */ }
Monitor 类:
提供了一种更复杂的同步机制,可以比 lock 提供更多的控制功能(如等待和信号)。
示例:Monitor.Enter(syncObject); /* 访问共享数据 */ Monitor.Exit(syncObject);
2.Mutex 类:
用于跨进程的同步,也可用于线程间同步。Mutex 能够在多个应用程序间提供同步。
示例:Mutex mutex = new Mutex(); mutex.WaitOne(); /* 执行代码 */ mutex.ReleaseMutex();
AutoResetEvent 和 ManualResetEvent:
用于线程间信号通信。AutoResetEvent 会在信号之后自动重置,而 ManualResetEvent 则需要手动重置。
示例:
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
autoResetEvent.Set(); // 发出信号
autoResetEvent.WaitOne(); // 等待信号
3.Semaphore 和 SemaphoreSlim:
用于限制同时访问某资源或代码块的线程数。SemaphoreSlim 是 .NET 的轻量级版本,不跨进程。
示例:
SemaphoreSlim semaphore = new SemaphoreSlim(3); // 最大3个线程
semaphore.Wait();
// 执行代码
semaphore.Release();
4.ConcurrentQueue 等集合类:
提供线程安全的集合类,如 ConcurrentQueue、ConcurrentStack 等,适用于生产者-消费者模式。
示例:
ConcurrentQueue
queue.Enqueue(1);
if (queue.TryDequeue(out var result)) { /* 处理结果 */ }
5.BlockingCollection:
支持生产者-消费者模式,并提供阻塞和限界功能。
示例:
BlockingCollection
collection.Add(1); // 阻塞直到可以添加
int item = collection.Take(); // 阻塞直到有项可用
6.Task 和 async/await 模型:
虽然不是专门用于线程间通信,但可以用来协调异步操作的执行。
示例:
async Task MyAsyncMethod()
{
await Task.Delay(1000); // 模拟异步操作
}