Глобальный мутекс
От: vvv848165@ya.ru  
Дата: 23.01.20 06:55
Оценка:
Почти всегда мутексы можно спрятать в private класса и это часто...
А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?
К примеру у меня такое:
1) нужен при новом входящем соединении (при добавлении в список дискрипторов соединений)
2) нужен для получения данных из БД (в момент подключения входящего соединения (1) (чтобы знать что до и после подкл.))
3) нужен для других списков реального времени(в момент подключения входящего соединения (1))
...
Может патерн какой подскажите?
Re: Глобальный мутекс
От: Muxa  
Дата: 23.01.20 07:04
Оценка: 1 (1)
VYR>Почти всегда мутексы можно спрятать в private класса и это часто...
VYR>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?
Расшарь объект с мютексом между инстансами разных классов

VYR>Может патерн какой подскажите?

хз. Паттерн "Общий объект"?
Re: Глобальный мутекс
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.01.20 07:23
Оценка: 1 (1) +3
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Почти всегда мутексы можно спрятать в private класса и это часто...

VYR>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?
В ООП такого лучше избегать.
VYR>К примеру у меня такое:
VYR>1) нужен при новом входящем соединении (при добавлении в список дискрипторов соединений)
То есть у вас есть общий ресурс — список дескрипторов соединений. Вот его и защищайте: либо вы выбираете thread-safe реализацию, либо сами велосипедите её так, чтобы все публичные методы списка корректно работали при параллельном обращении из многих потоков. Там не обязательно будет мьютекс — бывают лок-фри списки, бывают ReadWriteLock реализации, которые улучшают concurrency под нагрузкой.
Но в простом случае вы просто прячете мьютекс в private вашего класса "список дискрипторов соединений" и добавляете работу с ним во все публичные методы.

VYR>2) нужен для получения данных из БД (в момент подключения входящего соединения (1) (чтобы знать что до и после подкл.))

То есть у вас есть общий ресурс — БД (наверное). Если этот ресурс сам не является потокобезопасным, то вы точно так же, как и в предыдущем случае добавите мьютекс в его внутреннюю реализацию.
VYR>3) нужен для других списков реального времени(в момент подключения входящего соединения (1))
VYR>...
VYR>Может патерн какой подскажите?
Да нет тут никакого паттерна. Просто делаете ваши разделяемые ресурсы ("списки реального времени") потокобезопасными.
Если у вас есть желание замедлить своё приложение, то все разделяемые списки становятся членами класса-синглтона ApplicationState, мьютекс уходит в его private и делает этот класс потокобезопасным.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Глобальный мутекс
От: vvv848165@ya.ru  
Дата: 23.01.20 07:52
Оценка: -1
Здравствуйте, Sinclair, Вы писали:

S>В ООП такого лучше избегать.

ОГО типо новость сказал...
Вся фишка в том что все списки и БД нужно обновлять одновременно (любое промежуточное состояние сломает систему (или ещё хуже))

если защитить мутексами отдельные классы то корректно работать не будет — нужен общий...
Re: Глобальный мутекс
От: vvv848165@ya.ru  
Дата: 23.01.20 07:54
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

забыл: Наследовать тоже не ахти — слишком разные классы и множественое наследование не ахти.
Re: Глобальный мутекс
От: Maniacal Россия  
Дата: 23.01.20 07:56
Оценка: 3 (2) -2
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Почти всегда мутексы можно спрятать в private класса и это часто...

VYR>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?

Сделать статическим. Чтобы не делать публичным, можно функции Lock/Unlock статические добавить. Синглтон в конце концов с мьютексом какой-нибудь.
Re[3]: Глобальный мутекс
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.01.20 11:39
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Здравствуйте, Sinclair, Вы писали:


S>>В ООП такого лучше избегать.

VYR>ОГО типо новость сказал...
VYR>Вся фишка в том что все списки и БД нужно обновлять одновременно (любое промежуточное состояние сломает систему (или ещё хуже))

VYR>если защитить мутексами отдельные классы то корректно работать не будет — нужен общий...


Можно защитить мютексами и отдельные классы. Корректная работа будет зависеть от того, как реализована последовательность работы с мютексами при различных сценариях взаимодействия объектов системы. Не утверждаю, что корректную последовательность захватов можно реализовать всегда.
Re[3]: Глобальный мутекс
От: · Великобритания  
Дата: 23.01.20 13:54
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

S>>В ООП такого лучше избегать.

VYR>ОГО типо новость сказал...
VYR>Вся фишка в том что все списки и БД нужно обновлять одновременно (любое промежуточное состояние сломает систему (или ещё хуже))
Делаешь компонент ОбновлятельСписков, который будет разруливать многопоточность внутренними локами и одновременно их обновлять и в памяти, и в БД и т.п.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Глобальный мутекс
От: · Великобритания  
Дата: 23.01.20 14:10
Оценка:
Здравствуйте, Maniacal, Вы писали:

VYR>>Почти всегда мутексы можно спрятать в private класса и это часто...

VYR>>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?
M>Сделать статическим. Чтобы не делать публичным, можно функции Lock/Unlock статические добавить. Синглтон в конце концов с мьютексом какой-нибудь.
Глобальные переменные и синглтоны — зло.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Глобальный мутекс
От: Pavel Dvorkin Россия  
Дата: 23.01.20 14:10
Оценка: 23 (4) +1
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Почти всегда мутексы можно спрятать в private класса и это часто...

VYR>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?

В точности эта задача встала в свое время перед разработчиками Windows 95, когда они ее делали из Windows 3.x
В Windows 3.x не было потоков, а поэтому код GDI был сделан без всякой реентерабельности. В Windows 95 завели потоки, и сразу появился вопрос — что будет , если 2 потока одновременно обратятся к GDI.
Все попытки разбить GDI на отдельно защищаемые части закончились неудачно, и в итоге был создан Win16Mutex (он же Win16Lock)

http://www.fandecheng.com/personal/interests/ewindows/advanced_windows/win95_multitask.htm

и все функции GDI должны были его ожидать.

С точки зрения ООП — это просто глобальная переменная, синглетон.
With best regards
Pavel Dvorkin
Re: Глобальный мутекс
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 23.01.20 15:00
Оценка: :)
Здравствуйте, vvv848165@ya.ru, Вы писали:

Пришло время писать менеджер соединений где и будет храниться мьютекс.
Sic luceat lux!
Re[3]: Глобальный мутекс
От: Maniacal Россия  
Дата: 23.01.20 15:19
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Maniacal, Вы писали:


VYR>>>Почти всегда мутексы можно спрятать в private класса и это часто...

VYR>>>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?
M>>Сделать статическим. Чтобы не делать публичным, можно функции Lock/Unlock статические добавить. Синглтон в конце концов с мьютексом какой-нибудь.
·>Глобальные переменные и синглтоны — зло.

компонент ОбновлятельСписков тот же глобальный (все должны иметь доступ) неявный синглтон (больше одного экземпляра не нужно)
Re[4]: Глобальный мутекс
От: · Великобритания  
Дата: 23.01.20 15:29
Оценка:
Здравствуйте, Maniacal, Вы писали:

VYR>>>>Почти всегда мутексы можно спрятать в private класса и это часто...

VYR>>>>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?
M>>>Сделать статическим. Чтобы не делать публичным, можно функции Lock/Unlock статические добавить. Синглтон в конце концов с мьютексом какой-нибудь.
M>·>Глобальные переменные и синглтоны — зло.
M>компонент ОбновлятельСписков тот же глобальный
Это не так. Инстанс этого компонента будучи переданным явно туда где он требуется — никак не глобальный. Статическая переменная доступна фактически из любой строчки кода.

M>(все должны иметь доступ) неявный синглтон

Кто "все"? Все точно не должны.

M>(больше одного экземпляра не нужно)

Тесты не пишем?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Глобальный мутекс
От: reversecode google
Дата: 23.01.20 15:49
Оценка: +1
захайрите какого нибудь синьора
иначе никакой мютекс не поможет
Re: Глобальный мутекс
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.01.20 21:12
Оценка:
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Может патерн какой подскажите?


Ну казалось бы, если он всегда нужен в момент подключения входящего соединения, то и самое место ему в объекте, который ведает входящими соединениями...
Re[2]: Глобальный мутекс
От: vvv848165@ya.ru  
Дата: 24.01.20 05:34
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, vvv848165@ya.ru, Вы писали:


VYR>>Может патерн какой подскажите?


Pzz>Ну казалось бы, если он всегда нужен в момент подключения входящего соединения, то и самое место ему в объекте, который ведает входящими соединениями...


вот тото и оно — таких соединений 2 вида и из пользовательского интерфейса тоже (и при чтении тоже нужен)
Re: Глобальный мутекс
От: Igore Россия  
Дата: 24.01.20 07:49
Оценка: 3 (1)
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Почти всегда мутексы можно спрятать в private класса и это часто...

VYR>А вот если мутекс нужен для многих классов и многих их экземпляров... куда его запихнуть в плане ООП?
VYR>К примеру у меня такое:
VYR>1) нужен при новом входящем соединении (при добавлении в список дискрипторов соединений)
VYR>2) нужен для получения данных из БД (в момент подключения входящего соединения (1) (чтобы знать что до и после подкл.))
VYR>3) нужен для других списков реального времени(в момент подключения входящего соединения (1))
VYR>...
VYR>Может патерн какой подскажите?
По хорошему, как уже писали, все обращения к ресурсу должны идти через 1 класс, где у тебя и будет mutex с правильным обновлением всех данных в БД, ОП и т.д., но как я понял, сейчас уже все размазано по коду, в этом случае можно посмотреть на именованный mutex, он для межпроцесного взаимодействия, но если тебе на время, а потом будешь переделывать, вполне сойдет.
Re[2]: Глобальный мутекс
От: vvv848165@ya.ru  
Дата: 24.01.20 10:05
Оценка:
Здравствуйте, Igore, Вы писали:

I>По хорошему, как уже писали, все обращения к ресурсу должны идти через 1 класс, где у тебя и будет mutex с правильным обновлением всех данных в БД, ОП и т.д., но как я понял, сейчас уже все размазано по коду, в этом случае можно посмотреть на именованный mutex, он для межпроцесного взаимодействия, но если тебе на время, а потом будешь переделывать, вполне сойдет.


ресурс АМ — тоесть класс с mutex и агрегирует те обьекты которые работают с данными
(конечно повеселее чем один мутекс в сингелтоне) НО если продолжатель кода создаст экземпляры которые работают с данными вне этого класса — будет трудно выявить тестами.
Или можно защиту поставить?
Re[3]: Глобальный мутекс
От: vvv848165@ya.ru  
Дата: 24.01.20 10:47
Оценка: :)
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>Или можно защиту поставить?

блин С# — прям как за решёткой — ни друзей ни множественного наследования
Re[5]: Глобальный мутекс
От: Carc Россия https://vk.com/gosha_mazov
Дата: 24.01.20 14:17
Оценка:
Здравствуйте, ·, Вы писали:


·>Это не так. Инстанс этого компонента будучи переданным явно туда где он требуется — никак не глобальный. Статическая переменная доступна фактически из любой строчки кода.

доступна фактически из любой строчки кода

С фигов ли!?!
Замаскировать статическую переменную интерфейсом доступа это дело на 2-5 строчек… Или чуть больше, если использовать паттерн Slice или тот же Bridge.
Aml Pages Home
Отредактировано 24.01.2020 14:17 Carc . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.