Многопоточность: блокировка чтения при записи. - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming

Программирование / Programming
Ищете помощи в написании программы, есть сложность в выполнении задания (в институте и т.д.), пожалуйста, спросите у нас в данном форуме и мы обязательно вам поможем. При поддержке: Рейтинг серверов самых популярных online-игр

Ответ
Опции темы
Непрочитано 15.08.2016, 04:36   #1
Аватар для krisadr
Пользователь

Автор темы (Топик Стартер) Многопоточность: блокировка чтения при записи.

Допустим есть список в котором что то храним.
Код:
        private static OrderedDictionary<int, string> testMem = new OrderedDictionary<int, string>();

        public static void addIntString(int testInt, string testString)
        {
            testMem.Add(testInt, testString);
        }
        public static string getStringByInt(int testInt)
        {
            string testString;
            testMem.TryGetValue(testInt, out testString);
            return testString;
        }
К данному списку обращается множество потоков.
нужно заблокировать чтение(выполнение зеленого) если другой поток выполняет запись(выполняется красный метод) и восстановить работу зеленого как только красный закончит работу.
Причем чтение может выполнятся "одновременно" несколькими потоками если только не выполняется запись... по этому lock(object) ко всем методам не подходит. Чет не могу сообразить как это красиво реализовать...

Добавлено через 7 минут
Блин вот тупил часа 2, создал тему и тут же вспомнил про ManualResetEvent и все встало на свои места. Тема закрыта. А вообще самое лучше решение - ReaderWriterLock

Последний раз редактировалось krisadr; 15.08.2016 в 08:09. Причина: Добавлено сообщение
krisadr вне форума Ответить с цитированием
Непрочитано 15.08.2016, 04:45   #2
Пользователь

По умолчанию Re: Многопоточность: блокировка чтения при записи.

Цитата:
Сообщение от krisadr Посмотреть сообщение
Причем чтение может выполнятся "одновременно" несколькими потоками если только не выполняется запись... по этому lock(object) ко всем методам не подходит.
А Почему бы и не блокировать на время чтения? Это же сортированный словарь. Чтение выполняется практически мгновенно. Врятли тут будет затык по скорости.
flopix вне форума Ответить с цитированием
Непрочитано 15.08.2016, 04:51   #3
Аватар для krisadr
Пользователь

Автор темы (Топик Стартер) Re: Многопоточность: блокировка чтения при записи.

очень часто выполняется чтение и очень редко запись, объемы большие
krisadr вне форума Ответить с цитированием
Непрочитано 15.08.2016, 13:58   #4
Аватар для KID
Пользователь

По умолчанию Re: Многопоточность: блокировка чтения при записи.

на каждый словарь повесишь замок? не гони, на прямые операции add\remove слишком жирно будет, вот как начнешь итерировать - тогда подумай.
и с объемами подумай, ибо шарп не может в большие словари.
KID вне форума Отправить сообщение для KID с помощью Skype™ Ответить с цитированием
Непрочитано 15.08.2016, 16:42   #5
Аватар для ANZO
Разработчик BDO Emu

По умолчанию Re: Многопоточность: блокировка чтения при записи.

Если вам нужна потокобезопасность - используйте ConcurrentDictionary

https://msdn.microsoft.com/en-us/lib...or=-2147217396
ANZO вне форума Отправить сообщение для ANZO с помощью ICQ Отправить сообщение для ANZO с помощью Skype™ Ответить с цитированием
Непрочитано 15.08.2016, 17:32   #6
Аватар для krisadr
Пользователь

Автор темы (Топик Стартер) Re: Многопоточность: блокировка чтения при записи.

Цитата:
Сообщение от ANZO Посмотреть сообщение
Если вам нужна потокобезопасность - используйте ConcurrentDictionary

https://msdn.microsoft.com/en-us/lib...or=-2147217396
да я в курсе про такие словари\коллекции по принципу copyOnRead - теряем скорость

реализовал так (нужно параллельное чтение, а запись может и подождать, пока все потоки не прочитаются)
ReadWriteLockerSlim и стандартный не использовал ибо они ограничивают read
Код:
    public sealed class ReadWriteLockerPro
    {
        #region private
        #region vars
        private ManualResetEvent writeLock = new ManualResetEvent(true);
        private ManualResetEvent readLock = new ManualResetEvent(true);
        private volatile int readers = 0;
        #endregion
        #region methods
        #endregion
        #endregion

        #region public
        #region methods
        public void enterWriteLock()
        {
            readLock.WaitOne();
            writeLock.Reset();
        }
        public void exitWriteLock()
        {
            writeLock.Set();
        }
        public void enterReadLock()
        {
            writeLock.WaitOne();
            readLock.Reset();
            Interlocked.Increment(ref readers);
        }
        public void exitReadLock()
        {
            Interlocked.Decrement(ref readers);
            if (readers == 0)
                readLock.Set();
        }
        #endregion
        #region get/set
        #endregion
        #endregion
    }
По моему в полне годно

Добавлено через 9 минут
Цитата:
Сообщение от KID Посмотреть сообщение
на каждый словарь повесишь замок? не гони, на прямые операции add\remove слишком жирно будет, вот как начнешь итерировать - тогда подумай.
и с объемами подумай, ибо шарп не может в большие словари.
словари берутся из этой либы (PowerCollections.dll) - ссылку на ресурс потерял, но разраб утверждает кто коллекции спецом оптимизированы под большие обьемы

Последний раз редактировалось krisadr; 15.08.2016 в 17:42. Причина: Добавлено сообщение
krisadr вне форума Ответить с цитированием
Непрочитано 15.08.2016, 19:10   #7
Аватар для KID
Пользователь

По умолчанию Re: Многопоточность: блокировка чтения при записи.

krisadr, есть ситуации, когда в реальных условиях всякое годно превращается в говно. ну а либу, релизнутую в 2007, я бы очканул использовать. в любом случае метод тыка и ошибок самый полезный!
KID вне форума Отправить сообщение для KID с помощью Skype™ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Блокировка групп вк л2 afford Курилка / Yak floor 24 25.04.2015 13:55
Только для чтения kronk Курилка / Yak floor 14 07.02.2015 03:39
флешка - диск защищен от записи Gambit_J Операционные системы / Operating systems 23 09.01.2012 13:00
Тип вашей учетной записи... shturman Игровой клиент 3 23.06.2010 19:37
Блокировка бафа Hunk Работа со скриптами 2 11.07.2009 17:08


© 2007–2020 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 03:12. Часовой пояс GMT +3.

Вверх