Sobes.tech
Middle+

Чӣ гуна кор бо риштаиҳо ва вазифаҳо дар C# вақте ки чанд ришта ба ҳолати умумӣ дастрасӣ доранд?

sobes.tech AI

Ҷавоб аз AI

Ҳангоми кор бо ҳолати умумӣ дар C# бо чандирон, мушкилоти ҳамоҳангсозӣ ва ҳолатҳои рақобат пайдо мешаванд. Механизмҳои зерин истифода мешаванд:

  1. Блокировка (Locking):

    • Оператор lock барои эҷоди қисмати критикӣ истифода мешавад, ки кафолат медиҳад, ки танҳо як чандирон метавонад ба захира муҳофизатшуда дастрасӣ пайдо кунад.
    • Нақшаи объект-муҳр (одатан private readonly object) барои ҳамоҳангсозӣ истифода мешавад.
    // Намунаи истифодаи lock
    private readonly object _lockObject = new object();
    private int _sharedCounter = 0;
    
    public void IncrementCounter()
    {
        lock (_lockObject)
        {
            _sharedCounter++; // Қисми критикӣ
        }
    }
    
  2. Оператсияҳои атомӣ:

    • Класи 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.
  3. Классҳои ҳамоҳангсозӣ аз System.Threading ва System.Threading.Tasks:

    • Monitor: механизми пастсуръаттар барои блоккунии нисбат ба lock.
    • Mutex: имкон медиҳад, ки дастрасӣ ба захира байни чандирон ҳамоҳанг карда шавад.
    • SemaphoreSlim: шумораи чандиронро, ки метавонанд ҳамзамон ба захира дастрасӣ пайдо кунанд, маҳдуд мекунад.
    • ReaderWriterLockSlim: имкон медиҳад, ки чандирон ба таври ҳамзамон ба хондан дастрасӣ дошта бошанд, аммо танҳо як нафар ба навиштан.
  4. Коллексияҳои бехатар барои чандирон:

    • Пространствои ном 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);
    }
    
  5. Объектҳои беэътибор (Immutable objects):

    • Таҳия кардани объектҳои беэътибор маънои онро дорад, ки ҳолати онҳо пас аз эҷод кардан тағир дода намешавад. Агар ҳолати умумӣ бо объекте беэътибор ифода шавад, чандирон метавонанд бехатарона онро хонанд, бе ниёз ба ҳамоҳангсозӣ. Навсозии ҳолат ба эҷоди намунаи нави объект маҳдуд мешавад.

Ҳангоми кор бо вазифаҳо (Task) дар TPL (Task Parallel Library) низ бояд ба ҳамоҳангсозӣ дар дастрасӣ ба ҳолати умумӣ диққат дод. TPL осон мекунад эҷод ва идоракунии амалҳои параллелӣ, аммо масъулияти таъмин кардани бехатарии потокро дар кор бо маълумоти умумӣ бар душ дорад.

Интихоби механизми мувофиқ барои ҳамоҳангсозӣ ба вазифа ва хусусиятҳои дастрасӣ ба ҳолати умумӣ вобаста аст.