Middle+
Чӣ гуна кор бо риштаиҳо ва вазифаҳо дар C# вақте ки чанд ришта ба ҳолати умумӣ дастрасӣ доранд?
sobes.tech AI
Ҷавоб аз AI
Ҳангоми кор бо ҳолати умумӣ дар C# бо чандирон, мушкилоти ҳамоҳангсозӣ ва ҳолатҳои рақобат пайдо мешаванд. Механизмҳои зерин истифода мешаванд:
-
Блокировка (Locking):
- Оператор
lockбарои эҷоди қисмати критикӣ истифода мешавад, ки кафолат медиҳад, ки танҳо як чандирон метавонад ба захира муҳофизатшуда дастрасӣ пайдо кунад. - Нақшаи объект-муҳр (одатан
private readonly object) барои ҳамоҳангсозӣ истифода мешавад.
// Намунаи истифодаи lock private readonly object _lockObject = new object(); private int _sharedCounter = 0; public void IncrementCounter() { lock (_lockObject) { _sharedCounter++; // Қисми критикӣ } } - Оператор
-
Оператсияҳои атомӣ:
- Класи
System.Threading.Interlockedоператсияҳои атомиро таъмин мекунад (масалан,Increment,Decrement,Add,Exchange), ки барои чандирон бехатар мебошанд ва ниёз ба блоккунии ошкоро надоранд.
// Намунаи истифодаи Interlocked private volatile int _sharedValue = 0; // volatile барои намоён будани тағирот public void UpdateValue(int newValue) { Interlocked.Exchange(ref _sharedValue, newValue); // Тағйир додани атомӣ } public void IncrementValue() { Interlocked.Increment(ref _sharedValue); // Зиёд кардани атомӣ }- Ҳатто
volatileнамоён будани тағиротро байни чандирон таъмин мекунад, аммо атомикӣ кардани бисёрқадамӣ оператсияҳоро кафолат намекунад. Барои оператсияҳои атомӣ истифода баредInterlocked.
- Класи
-
Классҳои ҳамоҳангсозӣ аз
System.ThreadingваSystem.Threading.Tasks:Monitor: механизми пастсуръаттар барои блоккунии нисбат баlock.Mutex: имкон медиҳад, ки дастрасӣ ба захира байни чандирон ҳамоҳанг карда шавад.SemaphoreSlim: шумораи чандиронро, ки метавонанд ҳамзамон ба захира дастрасӣ пайдо кунанд, маҳдуд мекунад.ReaderWriterLockSlim: имкон медиҳад, ки чандирон ба таври ҳамзамон ба хондан дастрасӣ дошта бошанд, аммо танҳо як нафар ба навиштан.
-
Коллексияҳои бехатар барои чандирон:
- Пространствои ном
System.Collections.Concurrentколлексияҳоро дар бар мегирад (ConcurrentBag<T>,ConcurrentDictionary<TKey, TValue>,ConcurrentQueue<T>,ConcurrentStack<T>), ки махсус барои дастрасии бисёрчандирон таҳия шудаанд. Истифодаи ин коллексияҳо ниёз ба ҳамоҳангсозии дастӣ дар амалҳои асосӣ бо коллексияро бартараф мекунад.
// Намунаи истифодаи ConcurrentDictionary private ConcurrentDictionary<string, int> _sharedData = new ConcurrentDictionary<string, int>(); public void AddOrUpdateData(string key, int value) { _sharedData.AddOrUpdate(key, value, (k, oldValue) => oldValue + value); } - Пространствои ном
-
Объектҳои беэътибор (Immutable objects):
- Таҳия кардани объектҳои беэътибор маънои онро дорад, ки ҳолати онҳо пас аз эҷод кардан тағир дода намешавад. Агар ҳолати умумӣ бо объекте беэътибор ифода шавад, чандирон метавонанд бехатарона онро хонанд, бе ниёз ба ҳамоҳангсозӣ. Навсозии ҳолат ба эҷоди намунаи нави объект маҳдуд мешавад.
Ҳангоми кор бо вазифаҳо (Task) дар TPL (Task Parallel Library) низ бояд ба ҳамоҳангсозӣ дар дастрасӣ ба ҳолати умумӣ диққат дод. TPL осон мекунад эҷод ва идоракунии амалҳои параллелӣ, аммо масъулияти таъмин кардани бехатарии потокро дар кор бо маълумоти умумӣ бар душ дорад.
Интихоби механизми мувофиқ барои ҳамоҳангсозӣ ба вазифа ва хусусиятҳои дастрасӣ ба ҳолати умумӣ вобаста аст.