gpt4 book ai didi

multithreading - 不变的数据结构如何不是线程安全的?

转载 作者:行者123 更新时间:2023-12-03 12:44:03 25 4
gpt4 key购买 nike

在名为What is this thing you call "thread safe"?的帖子中,埃里克·利珀特(Eric Lippert)说:

Thread safety of immutable data structures is all about ensuring that use of the data across all operations is logically consistent, at the expense of the fact that you're looking at an immutable snapshot that might be out-of-date.


我认为不可变数据结构的全部要点是它们不会改变,因此 不能过时,因此它们本质上是线程安全的
利珀特在这里是什么意思?

最佳答案

What does Lippert mean here?


我同意我写那个特定位的方式并不尽如人意。
早在2009年,我们就为Roslyn设计了数据结构(即“C#和VB编译器即服务”),因此正在考虑如何在IDE中进行分析,而在这个世界中,代码几乎永远都不正确-如果代码正确,为什么要编辑它? -以及您输入时每秒可能改变几次的位置。

I thought the whole point of immutable data structures is that they do not change and therefore cannot be out of date, and that therefore they are intrinsically thread-safe.


事实是它们没有改变,这可能会使它们过时。考虑一下IDE中的一种常见情况:
using System;
class P
{
static void Main()
{
Console.E
}
}
我们有不可变的数据结构,它代表您键入“E”之前的世界,我们有不可变的数据结构,它代表您刚刚进行的编辑-敲击字母E-现在是一堆东西发生。
词法分析器知道先前的词法状态是不可变的,并且在“E”重新词法化位于E周围的世界之前而不是对整个 token 流进行词法化之前与世界匹配。类似地,解析器计算出此编辑的新(格式正确!)解析树的含义。这将创建一个新的不可变解析树,该树是对旧的不可变解析树的编辑,然后真正的乐趣就开始了。语义分析器尝试找出 Console的含义,然后找出 E的含义,以便它可以对以 System.Console开头的 E成员为中心进行IntelliSense下拉列表(如果有)。 (并且由于程序中现在存在许多语义和语法错误,因此我们也开始了一个错误报告工作流。)
现在,如果我们在后台线程上进行所有工作时,先按“退格键”,再按“W”键,会发生什么情况?
所有仍在进行中的分析将是正确的,但对于 Console.E而不是 Console.W它将是正确的。分析已过时。它属于一个不再相关的世界,我们必须重新开始分析退格和W。
简而言之,对另一个线程上的不可变数据结构进行分析是绝对安全的,但是UI线程上可能继续发生使该工作无效的事情。这是您为将不可变数据发送到工作线程而进行耕作工作所付的价格之一。
请记住,这些失效可能很快发生。由于重新打字,重新解析和IntelliSense更新的预算是30毫秒,因为快速打字员每秒可以获取十次以上的击键。使用一个词法分析器和解析器来重用过去的词法和解析器的不变状态是该策略的关键部分,但是您随后必须计划一个无效操作,以使您的当前分析尽快完成。
顺便说一句,我们需要发明的机制来有效地跟踪这些无效性本身就很有趣,并且导致对基于取消的工作流有一些见解,但这又是另一回事。

关于multithreading - 不变的数据结构如何不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65185160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com