Unk*_*own 1 c# variables thread-synchronization
当多个线程同时访问数据时,必须同步访问以防止数据完整性问题.局部变量是否需要同步?
当多个线程同时访问数据时,必须同步访问以防止数据完整性问题.局部变量是否需要同步?
问题表明你以错误的方式思考问题.一旦你开始正确思考问题,你就不需要再问这个问题了.
让我们首先删除问题中的错误.
当多个线程同时访问数据时,必须同步访问以防止数据完整性问题.
这是一种常见的特征,但它实际上是不正确的,因为它太弱了.描述情况的正确方法是:
所以它不是:
当多个线程同时访问数据时,必须同步访问以防止数据完整性问题.
在多线程代码的疯狂世界中,可能会出现与同时访问或数据完整性无关的问题.相反,它会更准确地说:
当多个线程对内存执行读写操作时,可以观察到这些读写操作是意外顺序,并且在意外时间违反程序不变量,除非使用同步原语将有效重新排序限制为保留程序不变量的顺序.
现在你的问题的答案是明确的:
局部变量是否需要同步?
如果必须遵守特定事件的特定顺序对局部变量进行读写操作以保留程序不变量,并且C#规范尚未保证所需的顺序,那么就像所有内存中的读写一样,他们必须使用同步原语来实现所需的顺序.
不要陷入其他一些答案所说的"当地人在堆栈中"的陷阱 - 他们不一定是短期游泳池!仅当本地生命周期短于方法激活时,并且当方法激活逻辑上形成堆栈时,本地仅在短期池中分配.作为lambda的闭合本地的本地具有较长的生命周期,迭代器块或异步方法中的本地是在其激活不形成堆栈的方法中.
此外,谁在乎呢?堆栈内存可以使用不安全的代码在线程之间共享.
也不要陷入认为某些当地人是"真正的当地人"而有些人是"假的本地人"的陷阱.本地的定义特征是它的名称具有局部范围,而不是它的寿命短.不保证当地人在C#中的寿命很短.
以下是一些可以在多个线程上访问本地的方法:
IEnumerator可以在多个线程访问.请注意,这几乎肯定会死得很厉害; 在这些条件下,迭代器块的设计并不安全.