У меня есть переменная экземпляра или свойство, которая разделяется между потоками.
Visibility не имеет значения, она не должна отражать самое последнее значение
Но атомность имеет значение, поэтому разорванные чтения или записи не допускаются.
- это предположения, которые я сделал в отношении кода образца? Конкретные вопросы
Что я спрашиваю, в основном то же самое, что происходит с проверенной Doulbe, если он не реализован правильно.
https://medium.com/@wangberlin2000/why- ... 90623fexbr /> rinkava /> rinkava /> rinkava /> rinkava /> rinkava /> rinkava /> rinkava phecked-singleton-0ba290623. То же самое относится и к C#, я использовал эту ссылку, потому что она короче, чем пример C#. UpdateMemberByInlineLableAsync ?
Может ли одно и то же произойти с другими функциями, когда каждая из них является единственной обновлением настройки ?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. Unsafe
// 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. Safe?
// 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. Safe?
// Api is an interface or a class with a non-sealed virtual function.
public async Task UpdateMemberByNonInlinableAsync(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. Safe?
// Api can be anything.
public async Task UpdateMemberByNonInlinableUsingBarrierAsync(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 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа? [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Может ли встроенный метод вызвать разорванное чтение/запись для ссылочного типа?
Anonymous » » в форуме C# - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-