并行复用HMACSHA256引发AccessViolationException问题咨询
关于HMACSHA256多线程复用引发System.AccessViolationException的问题解析
问题背景
我们的新应用运行数分钟或数小时后会随机崩溃,Windows事件查看器显示异常代码0xc0000005(对应System.AccessViolationException)。经多日排查,根源是为了优化性能缓存并复用HMACSHA256实例,被多线程同时访问导致崩溃——全程无业务日志,仅能通过系统错误码定位问题。
更令人困惑的是:
- 官方文档为何未提及并行访问
HMACSHA256会引发AccessViolationException? - .NET 6.0起该异常无法被常规
try-catch捕获,定位难度极大,文档为何未明确禁止复用(HMAC)SHA256实例?
复现代码
以下代码可立即触发该异常:
var keyString = "abcdefghijklmnopqrstuvwxyz0123456789"; var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(keyString)); var parallelOptions = new ParallelOptions() { MaxDegreeOfParallelism = 4 }; static IEnumerable<string> EnumerateStrings() { while (true) { yield return "A short string"; yield return "Lorem ipsum dolor sit amet, consectetur adipiscing elit ..."; } } Parallel.ForEach(EnumerateStrings(), parallelOptions, theString => hmac.ComputeHash(Encoding.UTF8.GetBytes(theString)));
关键说明
HMACSHA256及SHA256等哈希算法实例不具备线程安全性,内部维护着哈希计算的状态信息,多线程并发调用ComputeHash会导致状态混乱,进而触发内存访问违规异常- .NET 6.0开始,
AccessViolationException被归类为致命异常,常规try-catch无法捕获,进程会直接崩溃 - 官方文档虽未用醒目标注禁止复用,但在类的线程安全说明中明确标注为Not thread safe,隐含了不可多线程共享实例的要求
内容的提问来源于stack exchange,提问作者frakon
相关产品推荐
相关产品推荐

