У меня есть переменная экземпляра или свойство, которая разделяется между потоками.
Visibility не имеет значения, это не должно отражать самое последнее значение
Но атомность имеет значение, поэтому разорванные чтения или записи не допускаются.public class Service
{
public Setting Setting = new();
public Setting SettingProperty { get; set; } = new();
public virtual Setting SettingVirtualProperty { get; set; } = new();
// Called by other threads.
public async Task StartAsync()
{
// It doesn't have to be the most recent value.
var setting = Setting;
await Foo(setting);
await Bar(setting);
}
// Called by other threads.
// Api is a class with a non-virtual or sealed function.
public async Task UpdateMemberByInlinableAsync(Api api)
{
Setting = await api.GetSettingAsync();
// Inlined as below.
var t = new Setting();
Setting = ptrT;
// or
SettingProperty.BackingField = ptrT;
// Set members of t after assigning the ptr, which causes the torn read.
// Can it also cause a torn write,
// if other threads modify the members of Setting instead of assigning a new instance.
}
// Called by other threads.
// Api is a class with a non-virtual or sealed function.
public async Task UpdateVirtualMemberByInlinableAsync(Api api)
{
SettingVirtualProperty = await api.GetSettingAsync();
}
// Called by other threads.
// Api is an interface or a class with s non-sealed virtual function.
public async Task UpdateMemberByUnInlinableAsync(Api api)
{
// Inlining is not possible, so it returns the complete object?
// Reference asignment is atomic.
Setting = await api.GetSettingAsync();
// or
SettingProperty = await api.GetSettingAsync();
// or
SettingVirtualProperty = await api.GetSettingAsync();
}
// Called by other threads.
// Api can be anything.
public async Task UpdateMemberByUnInlinableUsingBarrierAsync(Api api)
{
var setting = await api.GetSettingAsync();
Thread.MemoryBarrier();
Setting = setting;
// or
SettingProperty = setting;
// or
SettingVirtualProperty = setting;
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... rence-type
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-