C# 中的线程通过 System.Threading 命名空间实现,核心类是 Thread。线程允许并行执行代码,适用于耗时操作或后台任务。

创建并启动线程

using System.Threading;

Thread thread = new Thread(() => 
{
    Console.WriteLine("线程执行中");
});
thread.Start(); // 启动线程

传递参数给线程
通过 ParameterizedThreadStart 或 Lambda 表达式传递参数:

Thread thread = new Thread((param) => 
{
    Console.WriteLine($"接收参数: {param}");
});
thread.Start("Hello"); // 传递参数

线程同步

多线程共享资源时需同步以避免竞态条件。

使用 lock 关键字

private static object _lock = new object();

lock (_lock)
{
    // 临界区代码
}

Monitor
提供更灵活的同步控制:

Monitor.Enter(_lock);
try
{
    // 临界区代码
}
finally
{
    Monitor.Exit(_lock);
}

线程池

通过 ThreadPool 管理线程复用,适合短生命周期任务:

ThreadPool.QueueUserWorkItem((state) => 
{
    Console.WriteLine("线程池任务执行");
});

异步编程(Task)

现代 C# 推荐使用 Task 替代直接操作线程:

Task.Run(() => 
{
    Console.WriteLine("Task 执行");
});

线程安全集合

使用 ConcurrentQueueConcurrentBag 等线程安全容器:

var queue = new ConcurrentQueue<int>();
queue.Enqueue(1);
queue.TryDequeue(out int item);

注意事项

  • 避免死锁:确保锁的获取和释放顺序一致。
  • 取消任务:使用 CancellationToken 终止线程或任务。
  • UI 线程:在 WPF/WinForms 中,通过 Dispatcher.Invoke 更新 UI。

示例:多线程计算

int result = 0;
Thread[] threads = new Thread[4];

for (int i = 0; i < threads.Length; i++)
{
    threads[i] = new Thread(() => 
    {
        for (int j = 0; j < 1000; j++)
        {
            Interlocked.Increment(ref result); // 原子操作
        }
    });
    threads[i].Start();
}

foreach (var t in threads) t.Join();
Console.WriteLine($"结果: {result}"); // 输出 4000

通过合理使用线程、同步机制和异步模式,可以高效处理并发任务。

线程锁

线程锁的基本概念

定义线程锁及其在多线程编程中的作用,解释为什么需要线程锁来避免竞态条件和数据不一致问题。

线程锁的类型

互斥锁(Mutex):最基本的锁类型,同一时间只允许一个线程访问共享资源。
读写锁(ReadWrite Lock):区分读操作和写操作,允许多个读线程同时访问,但写线程独占资源。
自旋锁(SpinLock):通过循环等待而非阻塞线程来实现同步,适用于短时间锁竞争场景。
条件变量(Condition Variable):与锁配合使用,实现线程间的条件等待和唤醒机制。

线程锁的实现原理

基于硬件支持的原子操作(如CAS指令)实现锁的基本功能。
操作系统提供的同步原语(如futex)在用户态和内核态之间的协作机制。
锁的公平性与非公平性对线程调度的影响。

线程锁的使用场景

多线程共享资源的保护,如全局变量、共享数据结构等。
避免死锁的常见策略,如锁顺序、超时机制和死锁检测。
锁粒度对性能的影响,粗粒度锁与细粒度锁的权衡。

线程锁的性能优化

减少锁的持有时间,避免在锁内执行耗时操作。
无锁编程(Lock-Free)与乐观锁(Optimistic Locking)的替代方案。
锁的分段(Striping)和缓存友好性优化。

常见问题与调试技巧

死锁的诊断与排查工具(如gdb、Valgrind)。
锁竞争导致的性能瓶颈分析方法。
线程安全的数据结构和库的选择建议。

线程锁在不同语言中的实现

C/C++中的pthread_mutex和std::mutex。
Java中的synchronized关键字和ReentrantLock。
Python的threading.Lock和GIL(全局解释器锁)的影响。

未来发展趋势

硬件级同步原语的演进(如TSX指令集)。
分布式环境下的锁机制(如Redis分布式锁)。
无锁数据结构和算法的进一步普及。

更多推荐