powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оформление кода multi-thread приложения.
25 сообщений из 51, страница 1 из 3
Оформление кода multi-thread приложения.
    #39623738
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть, если код, реализующий процедуру задачи нити, оформлять строго в виде отдельного модуля, то проблем с нежелательным изменением памяти станет меньше? Нет видимости - нет и проблем.
Т.е., работать только с блоком параметров (сгенерированным по правилам thread-safe данного конкретного случая) и сообщениями, получаемыми из очереди нити.
Ни блокировок, ни семафоров, ни синхронизации.
Попробуйте. Вот увидите, многое станет проще.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623740
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Беда только в том, что часто, почти всегда, приходится работать с общими данными. По собственному написанию множества потоков.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623742
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

а ты не работай с общими данными, работай с сообщениями. Вот и все.
"По собственному опыту", аналогично, ага.:)
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623748
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоже по собственному опыту
если общие данные, то в основном на чтение
а чаще, если подумать, то можно и завернуть потоку с собой порцию данных, которые будут совсем не общие, а только его
а при возвращении из потока решать, что делать с данными, которые получились в нем
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623752
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkin...
если общие данные, то ...

Не надо "общих" данных. Совсем. :)
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623753
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно нет.
и правда ) если программа обрабатывает и визуализирует данные, зачем разным частям программы эти "общие" данные ?
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623757
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkin,

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

Понимаю, что у тебя мировоззрение уже устаканилось, есть приемчики решения проблем при условии их наличия.
Но что плохого работать просто в условиях, когда этих проблем нет?
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623758
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДПопробуйте. Вот увидите, многое станет проще.
[spoiler][youtube=
YouTube Video
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623759
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

диссертации уже давно написаны.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623767
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДдиссертации уже давно написаны.
ты бы код или схему привел, а то привычно все сведется к троллингу и срачу. Кто умеет - без тебя знает, кто не в курсе - однозначно не поймет, о чем тема
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623772
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокчччДдиссертации уже давно написаны.
ты бы код или схему привел, а то привычно все сведется к троллингу и срачу. Кто умеет - без тебя знает, кто не в курсе - однозначно не поймет, о чем тема
Ну ё. Какой код, это всего лишь предложение подхода.

Ну ладно.
Например. Берем знаменитый класс вадмана, но код метода треда реализуем не в классе (и не в наследнике), а в отдельной, автономной процедуре, определенной в отдельном физическом модуле. Ссылку на процедуру передаем, например, в конструктор класса. Сам же класс имеет интерфейс, реализующий минимум: запуск метода треда, передача блока данных (ну там и передача строки и других примитивов, если неймется), проверка наличия полученных данных в очереди, синхронное получение данных. Можно для удобства - назначение коллбэка на заданный тип входящего сообщения и т.п. сахарок. Самое главное - изолировать метод треда от внешнего мира. Модуль с реализацией метода должен "видеть" лишь структуры (типы) сообщений и константы, идентифицирующие сообщения.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623805
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то бред
А как же настройки? Статистика?
Сообщения - тоже говно. Лок фри форева.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623809
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все потоки программы должны быть максимально независимы друг от друга (желательно, полностью), и иметь минимум общих ресурсов (желательно, вообще не иметь).
Есть только одно очевидное исключение: поток может управлять порождаемыми им потоками (создавать, завершать, будить, добавлять в очередь... как-то еще управлять).
Всё, больше взаимосвязей быть не должно. В идеале, к которому необходимо стремиться.

С осознания этого и надо начинать строить архитектуру программ.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623811
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock...
Есть только одно очевидное исключение: поток может управлять порождаемыми им потоками (создавать, завершать, будить, добавлять в очередь... как-то еще управлять).
...
Что значит "будить"? Тред "спит", пока нет работы. Отправил в тред сообщение - он и проснулся.

"Добавлять в очередь" == посылать сообщение? Поясни.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623812
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Спит (пока нет работы) - ждет события, например. Разбудить - взвести это событие.
Либо, если используется очередь сообщений - то да, послать сообщение.

Добавить в очередь - это добавить в очередь. Если использовать очередь сообщений - да, послать сообщение.

Я лично не люблю очереди сообщений, самописную очередь использую.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623817
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, понял, спасибо. Я тоже не имею в виду под "очередью сообщений" именно "системную" очередь окна или треда (хотя и не исключаю такого варианта).
Так как у меня практически везде используется библиотека ZeroMQ, я часто использую ее очереди, а сообщения пересылаю с помощью протокола inproc той же самой библиотеки ZeroMQ: легко, быстро, безопасно. К тому же еще и кроссплатформенно. :) А также практически бескровно можно перейти от inter-thread сообщений к inter-process и inter-computer (в локальной сети). Детали реализации, в общем, несущественны.

Ну вот. Отвлек меня. :)

Я об изоляции кодирования конкретной задачи. Если изоляция на уровне процессов не вызывает сомнений и затруднений (хотя, кто-то все же норовит заюзать систему синхронизации для доступа к разделяемым ресурсам), то при кодировании задачи на уровне треда сплошь и рядом наблюдаем попытки реализовать синхронизацию доступа к общим ресурсам с использованием всяких непотребств, в результате часто в лучшем случае вместо распараллеливания получаем кооперативную квазипараллельность, а в худшем - "непонятное" поведение многонитевого приложения. Нарабатываются методики обхода, но ведь всего лишь достаточно использовать сообщения и очереди ("системные" или "самодельные").

В большинстве случаев, имхо.

Нездоровые случаеи погони за ложными целями типа "оптимизация ради оптимизации", о которых лучше не упоминать, я не упоминаю. :)
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623834
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати интересно, как вы видите решение следующей задачи

Есть потоки-эмиттеры, которые херачат «сообщения», которые в дальнейшем обрабатывают потоки-обработчики. Причём потоки-эмиттеры сами могут быть потоками-обработчиками каких-то других сообщений. Типичная реализация конвейера.

Как я себе это вижу. Между потоками-эмиттерами и потоками-обработчиками должна быть лок-фри очередь «сообщений». Поток-обработчик берёт элемент очереди, если нифига не получил - значит простаивает.

Так вот мне интересно, кто как организовывает это простаивание.
Можно разу идти на новую итерацию, можно сделать pause, можно SwitchToThread (как это в POSIX?), можно делать Sleep(0) или Sleep(1)

Лично я делаю счётчик, и в зависимости от счётчика простоя - вызываю тот или иной метод. Кто что думает?

Мне данный простой вообще не нравится. Какой-то он не умный. Говорят, в новых виндах есть ивент на модификацию памяти. Но не понятно, насколько он эффективен. И нужно кроссплатформенное решение.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623836
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как венда работает - непостижимо. У ней внутре потоков больше, чем звезд на небе и менеджеров памяти, кроме Heap-функций нету...

Напридумывают себе гамаков, а потом трудности мужественно преодолевают.

Все вроде уже написано, включая обход подводных граблей, в
http://www.sql.ru/forum/781947/nayti-v-pdf-knigu-multithreading-the-delphi-way-martin-harvey
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623846
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

У меня есть многопоточный список строк для чего-то подобного. Поток, принимающий сообщения, просто засыпает в ожидании строки в списке:

Код: pascal
1.
2.
3.
4.
procedure TPushPop.WaitForItem;
begin
 FWaitItemEvent.WaitFor(INFINITE);
end;



авторВсе вроде уже написано, включая обход подводных граблей, в

Многое уже придумано до нас. Только что вместо того, что бы изучать предмет выдумывают гору своих костылей.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623847
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПоток-обработчик берёт элемент очереди, если нифига не получил - значит простаивает.

Так вот мне интересно, кто как организовывает это простаивание.
Можно разу идти на новую итерацию, можно сделать pause, можно SwitchToThread (как это в POSIX?), можно делать Sleep(0) или Sleep(1)Не совсем понимаю, почему не подходит обычный event (который взводится при добавлении нового элемента в общую очередь) и waitfor на него во всех потоках-оброботчиках?
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623851
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockобщую очередьНеправильно выразился. Тут же не очередь, а список заданий, как я понял.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623867
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiКак венда работает - непостижимо. У ней внутре потоков больше, чем звезд на небе и менеджеров памяти, кроме Heap-функций нету...

Напридумывают себе гамаков, а потом трудности мужественно преодолевают.

Все вроде уже написано, включая обход подводных граблей, в
http://www.sql.ru/forum/781947/nayti-v-pdf-knigu-multithreading-the-delphi-way-martin-harvey
Действительно, непостижимо. Обнаружив в теме что-то знакомое (хоть слово), некоторые люди стараются сразу же в этой теме отметиться.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623879
kep-ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockНе совсем понимаю, почему не подходит обычный event возможно из-за экономии на sysenter.
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623884
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kep-koYuRockНе совсем понимаю, почему не подходит обычный event возможно из-за экономии на sysenter.Sleep дает эту экономию? )
...
Рейтинг: 0 / 0
Оформление кода multi-thread приложения.
    #39623938
kep-ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock, sleep только когда уже-ещё нет элементов, а wait будет для каждого.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Оформление кода multi-thread приложения.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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