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 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分布式锁)。
无锁数据结构和算法的进一步普及。
更多推荐



所有评论(0)