C# 线程基础

C# 线程基础 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 执行); });线程安全集合使用ConcurrentQueue、ConcurrentBag等线程安全容器var queue new ConcurrentQueueint(); 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分布式锁。无锁数据结构和算法的进一步普及。