У меня есть переменная экземпляра или свойство, называемое настройкой < /code>, которая используется среди потоков.
Новый экземпляр будет иногда назначать этой переменной другим потоком.
Метод с использованием настройки < /code> будет скопировать ссылку перед работой, и это нормально использовать старую настройку < /code>, если она обновлена, когда задание начинается, поэтому не требуется блокировка. Одиночное чтение и запись о эталонном типе является атомным в C#, но составная инструкция, такая как var foo = new foo () < /code> не атомна, и его инструкции можно переупорядочить. />https://medium.com/@wangberlin2000/why- ... a2906623fe
ссылка написана на Java, но то же самое относится и к C#. но инициализация объекта не завершена.
Пример кода имеет 3 настройки . Переменная члена экземпляра, свойство и виртуальное свойство и функции, которые обновляют настройку . Это для демонстрационной цели, и в реальном коде есть только одна настройка и одна функция.
[*] безопасно ли Updatememberasync для использования, поскольку содержание GetSetAsync не может пролить до или после await Codeming? Небезопасно использовать, потому что getSetting может быть вставлена вместо того, чтобы отменять начальный объект ?
Является ли UpdatevirtualmemberbyInlinable безопасно для использования, потому что виртуальное свойство не может быть вставлено? Inled?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);
}
// Api is a class with a non-virtual or sealed function.
public void UpdateMemberByInlinable(Api api)
{
Setting = api.GetSetting();
// 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?
}
// Api can be anything.
public async Task UpdateMemberAsync(Api api)
{
Setting = await api.GetSettingAsync();
// or
SettingProperty = await api.GetSettingAsync();
// or
SettingVirtualProperty = await api.GetSettingAsync();
}
// Api can be anything.
public void UpdateVirtualMemberByInlinable(Api api)
{
SettingVirtualProperty = api.GetSetting();
}
// Api is an interface or a class with a non-sealed virtual function.
public void UpdateMemberByNonInlinable(Api api)
{
Setting = api.GetSetting();
// or
SettingProperty = api.GetSetting();
}
// Api can be anything.
public void UpdateMemberUsingBarrier(Api api)
{
var setting = api.GetSetting();
Thread.MemoryBarrier();
Setting = setting;
// or
SettingProperty = setting;
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... rence-type
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? [закрыто] ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа?
Anonymous » » в форуме C# - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-