C#多线程搜索大二进制文件重复字节模式时参数越界异常排查
大文件多线程字节模式搜索异常原因分析
原代码的核心错误
- FileStream的位置操作非线程安全:你原代码大概率是让多个线程共享同一个
FileStream实例。FileStream的Position属性属于实例级状态,没有内置同步机制。当线程A刚调用Seek把位置设为目标偏移量,线程B立刻修改这个位置,线程A后续执行Read时,实际读取的是线程B设置的位置,甚至会出现计算出的读取偏移量超出文件总长度的情况,直接触发System.ArgumentOutOfRangeException。 - 并发读写的状态混乱:多线程同时对共享流执行定位和读取操作,会导致读取的起始位置完全不可控。比如某线程计算出的剩余可读字节数刚好够读取
patternSize,但另一个线程修改位置后,当前线程的读取请求就会因为剩余字节不足而触发参数越界异常。 - 加锁导致性能暴跌的原因:给共享
FileStream加锁后,所有线程必须串行等待锁释放,相当于把多线程并行操作退化成单线程执行,完全丧失了多线程提升效率的意义,自然速度极慢。
独立FileStream方案有效的原因
- 每个线程拥有独立的
FileStream实例,各自维护自己的Position状态,线程间不会互相干扰,从根源上避免了位置混乱导致的偏移量错误。 - 设置
FileShare.Read参数后,系统允许多个流同时读取同一个文件,既保证了多线程并行读取的效率,又不会出现文件访问冲突。
内容的提问来源于stack exchange,提问作者PoKeRGT
相关产品推荐
相关产品推荐

