powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Насчёт синхронизируемого объекта - lock(synchObject)
7 сообщений из 32, страница 2 из 2
Насчёт синхронизируемого объекта - lock(synchObject)
    #39129078
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexUser987Result делает слепок с набора результатов и потом сразу "освобождает" (в смысле, что перестаёт использовать - считывать значения там и прочее) этот набор, чтобы Calc дальше мог в него писать. В момент создания слепка я и применяю блокировку через lock.
ИМХУ тут обратно надо. Calc делает слепок и отдает его, тогда блокировок не надо. Опять же вопрос как часто это надо? Например если Result() обрабатывает только каждый тысячный слепок, то будет лишний тормоз.
...
Рейтинг: 0 / 0
Насчёт синхронизируемого объекта - lock(synchObject)
    #39129154
AlexUser987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ тут обратно надо. Calc делает слепок и отдает его, тогда блокировок не надо.
Т. е. тот, кто считает, тот же и слепок делает?

Да в принципе не важно, по-моему, кто там чего делает - Calc, Result или ещё какие сущности. Я просто примерно раскидал задачи по классам. Можно всё и в один класс запихать, а можно и ещё разделить.

Или я вас не понял.

Важно, что есть одновременный доступ к результатам расчёта из разных потоков. Потому что вот эти вещи

1) расчёт,
2) сохранение результатов в переменных в ОЗУ в процессе расчёта,
3) создание слепка из результатов,
4) вывод слепка результатов на экран

должны быть как можно больше независимы друг от друга.

У меня раньше было без слепка. Т. е. на протяжении всего расчёта данные писались в набор результатов под локом, и класс Result не мог получить к ним доступ, чтобы вывести результаты на экран. Когда же получал, то выводил именно результаты (пункт 2), а не слепок.

Расчёт длится гораздо дольше создания слепка результатов. Поэтому, когда я ввёл слепок, я смог больше распараллелить всю работу, т. к. теперь, фактически, локи работали только в моменты создания слепка.

Вообще без локов, на мой взгляд - только если накапливать весь набор результатов в коллекцию наборов результатов. И потом Result будет брать самый последний добавленный набор результатов (банально проверяем свойство Count без всяких локов, и берём текущее последнее значение). Ну, я уже об этом раньше писал.

Я так думаю.

Arm79AlexUser987,

Элементов в наборе данных много? десятки? сотни? тысячи? миллионы?
В смысле элементов? Число коллекций, объектов, значений? Или вплоть до числа элементов в каждой коллекции? Если первое, то 20-100.
...
Рейтинг: 0 / 0
Насчёт синхронизируемого объекта - lock(synchObject)
    #39129258
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexUser987В смысле элементов? Число коллекций, объектов, значений? Или вплоть до числа элементов в каждой коллекции? Если первое, то 20-100.
Коллекций до 100? А в каждой коллекции сколько элементов?
...
Рейтинг: 0 / 0
Насчёт синхронизируемого объекта - lock(synchObject)
    #39129327
AlexUser987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79AlexUser987В смысле элементов? Число коллекций, объектов, значений? Или вплоть до числа элементов в каждой коллекции? Если первое, то 20-100.
Коллекций до 100? А в каждой коллекции сколько элементов?
Нет. Коллекций штук 10-20. Плюс несколько десятков строковых и числовых переменных, собранных в разные объекты.

Коллекции есть разные. Есть, где в принципе 1-10 элементов и больше навряд ли будет. А есть, где 100-10000. Да и я сейчас стараюсь переработать, чтобы не более 2000-3000 было.
...
Рейтинг: 0 / 0
Насчёт синхронизируемого объекта - lock(synchObject)
    #39129338
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexUser987Dima TИМХУ тут обратно надо. Calc делает слепок и отдает его, тогда блокировок не надо.
Т. е. тот, кто считает, тот же и слепок делает?
Да

AlexUser987Да в принципе не важно, по-моему, кто там чего делает - Calc, Result или ещё какие сущности. Я просто примерно раскидал задачи по классам. Можно всё и в один класс запихать, а можно и ещё разделить.

Или я вас не понял.

Важно, что есть одновременный доступ к результатам расчёта из разных потоков. Потому что вот эти вещи

1) расчёт,
2) сохранение результатов в переменных в ОЗУ в процессе расчёта,
3) создание слепка из результатов,
4) вывод слепка результатов на экран

должны быть как можно больше независимы друг от друга.
Определись уже важно или нет.
Если слепок делает Result то он должен остановить Calc, следовательно Calc должен регулярно проверять блокировку, что тоже ресурсы потребляет.
Если слепок делает Calc, то ему не надо проверять блокировки, он просто сделал новый слепок, отдал на него ссылку и больше этот слепок не трогает. Чтобы отдать ссылку синхронизации не надо.
...
Рейтинг: 0 / 0
Насчёт синхронизируемого объекта - lock(synchObject)
    #39129879
AlexUser987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли слепок делает Calc, то ему не надо проверять блокировки, он просто сделал новый слепок, отдал на него ссылку и больше этот слепок не трогает. Чтобы отдать ссылку синхронизации не надо.
Да, не надо. Просто, по-вашему, Calc будет после каждой итерации расчёта слепки делать в том же потоке, вместо того, чтобы заниматься новой итерацией. Я вас правильно понял?

У меня логика такая, что Result сам запрашивает/делает слепок. Т. е. Calc должен только молотить расчёт. В принципе, если Result не запросит ни разу результат для отображения, то Calc так и домолотит до конца и оставит в переменных результатов последний вариант результатов. Это я сделал для того, чтобы легко было приспособить всю схему под клиент-сервер. Когда сервер только считает, но не оповещает клиента, что закончилась очередная итерация расчёта. Вместо этого сам клиент запрашивает сервер в цикле и, если новая итерация закончилась, то получает слепок. При этом неважно, какой класс делает слепок на стороне сервера - сам Calc или специально созданный для этого класс. Вот это я имел ввиду, говоря

авторДа в принципе не важно, по-моему, кто там чего делает - Calc, Result или ещё какие сущности

А насчёт этого

авторэти вещи

1) расчёт,
2) сохранение результатов в переменных в ОЗУ в процессе расчёта, (у меня объединено с 1)
3) создание слепка из результатов,
4) вывод слепка результатов на экран

должны быть как можно больше независимы друг от друга.

я имел ввиду по потокам. Т. е. вышеперечисленные пункты должны выполняться в разных потоках. Но при этом код этих пунктов может быть где угодно - хоть в одном классе, хоть в разных - это просто методы классов.

И вот в клиент-серверном варианте я сделал как вы сказали - у меня метод, делающий слепок, находится в классе Calc (исторически сложилось - ещё не разбил свой god-class на части). Класс Result находится на клиенте. Да, в принципе, и в локальном варианте то же самое - просто библиотеку расчёта я перенёс из веб-сервиса на клиент и принцип работы не изменился - Result запрашивает Calc о новых результатов и просит сделать слепок.
...
Рейтинг: 0 / 0
Насчёт синхронизируемого объекта - lock(synchObject)
    #39129880
AlexUser987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, наверное, вас запутал. Потому что хотел задать простой вопрос, а реальная ситуация у меня сложнее. Пришлось наворачивать и наворачивать по мере обсуждения. Вобщем, я достаточно просветился, спасибо за помощь.
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Насчёт синхронизируемого объекта - lock(synchObject)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]