文章

C#多线程深入

C#多线程线程操作和同步机制

C#多线程深入

前言

多线程的东西实在是太多了,一篇文章说不完

本文将包括更多线程操作和同步机制

  • Semaphore/SemaphoreSlim:控制同时访问资源的线程数
  • CountdownEvent:等待多个线程任务完成
  • ManualResetEvent / AutoResetEvent:线程间信号通知
  • Barrier:多线程协调同步,适合分阶段执行
  • Task:高级并发控制,支持任务链、异步操作
  • Dataflow Blocks:数据流处理,适合复杂的并发任务传递
  • ReaderWriterLockSlim:读写锁,优化多读少写场景
  • Concurrent Collections:线程安全集合,支持线程间通信

你可以在这里找到多线程入门

此页面由于东西太多尚未完工

事件(Event)同步机制

ManualResetEvent / AutoResetEvent:用于在线程之间发信号,让一个或多个线程等待另一个线程的信号。ManualResetEvent 可以手动重置信号,而 AutoResetEvent 每次发送信号后会自动重置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AutoResetEvent autoEvent = new AutoResetEvent(false);

void Thread1()
{
    Console.WriteLine("线程1等待信号...");
    autoEvent.WaitOne(); // 阻塞,直到信号被设置
    Console.WriteLine("线程1收到信号,继续执行");
}

void Thread2()
{
    Console.WriteLine("线程2准备发送信号...");
    autoEvent.Set(); // 设置信号,释放等待的线程
}

障碍器(Barrier)

Barrier 是一种多线程协调机制,让一组线程在执行到指定点时等待其他线程,然后再一起继续执行。适合需要分阶段执行的多线程任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Barrier barrier = new Barrier(3, (b) =>
{
    Console.WriteLine("所有线程都已到达屏障点,继续执行下一阶段");
});

for (int i = 0; i < 3; i++)
{
    Task.Run(() =>
    {
        Console.WriteLine("线程到达屏障点");
        barrier.SignalAndWait(); // 线程到达屏障点
        Console.WriteLine("线程继续执行下一阶段");
    });
}

读写锁(ReaderWriterLockSlim)

ReaderWriterLockSlim是一种读写锁,允许多个线程同时读数据(不冲突),但写入时会阻塞其他读写操作。适合读操作频繁但写操作较少的场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();

void ReadData()
{
    rwLock.EnterReadLock();
    try
    {
        // 读取操作
    }
    finally
    {
        rwLock.ExitReadLock();
    }
}

void WriteData()
{
    rwLock.EnterWriteLock();
    try
    {
        // 写入操作
    }
    finally
    {
        rwLock.ExitWriteLock();
    }
}

线程间通信(Thread Communication)

通过 线程安全队列(如 ConcurrentQueue)、任务通道(Channel)等,可以实现线程之间的数据传递和通信

(有点类似Avalonia中的Dispatcher)

1
2
3
ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
queue.Enqueue(1);
queue.TryDequeue(out int result);
本文由作者按照 CC BY 4.0 进行授权