|
|
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
Может быть, если код, реализующий процедуру задачи нити, оформлять строго в виде отдельного модуля, то проблем с нежелательным изменением памяти станет меньше? Нет видимости - нет и проблем. Т.е., работать только с блоком параметров (сгенерированным по правилам thread-safe данного конкретного случая) и сообщениями, получаемыми из очереди нити. Ни блокировок, ни семафоров, ни синхронизации. Попробуйте. Вот увидите, многое станет проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 17:42 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
чччД, Беда только в том, что часто, почти всегда, приходится работать с общими данными. По собственному написанию множества потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 18:01 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
makhaon, а ты не работай с общими данными, работай с сообщениями. Вот и все. "По собственному опыту", аналогично, ага.:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 18:04 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
тоже по собственному опыту если общие данные, то в основном на чтение а чаще, если подумать, то можно и завернуть потоку с собой порцию данных, которые будут совсем не общие, а только его а при возвращении из потока решать, что делать с данными, которые получились в нем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 18:25 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
krapotkin... если общие данные, то ... Не надо "общих" данных. Совсем. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 18:43 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
конечно нет. и правда ) если программа обрабатывает и визуализирует данные, зачем разным частям программы эти "общие" данные ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 18:55 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
krapotkin, ты сам себе придумал, что треды якобы должны работать с общими данными, вот и страдаешь. Треды нужны не для совместной обработки общих данных, а для совместной работы над общей задачей. Понимаю, что у тебя мировоззрение уже устаканилось, есть приемчики решения проблем при условии их наличия. Но что плохого работать просто в условиях, когда этих проблем нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 19:18 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
чччДПопробуйте. Вот увидите, многое станет проще. [spoiler][youtube= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 19:19 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 19:26 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
чччДдиссертации уже давно написаны. ты бы код или схему привел, а то привычно все сведется к троллингу и срачу. Кто умеет - без тебя знает, кто не в курсе - однозначно не поймет, о чем тема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 19:53 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
ДокчччДдиссертации уже давно написаны. ты бы код или схему привел, а то привычно все сведется к троллингу и срачу. Кто умеет - без тебя знает, кто не в курсе - однозначно не поймет, о чем тема Ну ё. Какой код, это всего лишь предложение подхода. Ну ладно. Например. Берем знаменитый класс вадмана, но код метода треда реализуем не в классе (и не в наследнике), а в отдельной, автономной процедуре, определенной в отдельном физическом модуле. Ссылку на процедуру передаем, например, в конструктор класса. Сам же класс имеет интерфейс, реализующий минимум: запуск метода треда, передача блока данных (ну там и передача строки и других примитивов, если неймется), проверка наличия полученных данных в очереди, синхронное получение данных. Можно для удобства - назначение коллбэка на заданный тип входящего сообщения и т.п. сахарок. Самое главное - изолировать метод треда от внешнего мира. Модуль с реализацией метода должен "видеть" лишь структуры (типы) сообщений и константы, идентифицирующие сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 20:25 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
Какой-то бред А как же настройки? Статистика? Сообщения - тоже говно. Лок фри форева. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 00:15 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
Все потоки программы должны быть максимально независимы друг от друга (желательно, полностью), и иметь минимум общих ресурсов (желательно, вообще не иметь). Есть только одно очевидное исключение: поток может управлять порождаемыми им потоками (создавать, завершать, будить, добавлять в очередь... как-то еще управлять). Всё, больше взаимосвязей быть не должно. В идеале, к которому необходимо стремиться. С осознания этого и надо начинать строить архитектуру программ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 00:40 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
YuRock... Есть только одно очевидное исключение: поток может управлять порождаемыми им потоками (создавать, завершать, будить, добавлять в очередь... как-то еще управлять). ... Что значит "будить"? Тред "спит", пока нет работы. Отправил в тред сообщение - он и проснулся. "Добавлять в очередь" == посылать сообщение? Поясни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 00:58 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
чччД, Спит (пока нет работы) - ждет события, например. Разбудить - взвести это событие. Либо, если используется очередь сообщений - то да, послать сообщение. Добавить в очередь - это добавить в очередь. Если использовать очередь сообщений - да, послать сообщение. Я лично не люблю очереди сообщений, самописную очередь использую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 01:18 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
YuRock, понял, спасибо. Я тоже не имею в виду под "очередью сообщений" именно "системную" очередь окна или треда (хотя и не исключаю такого варианта). Так как у меня практически везде используется библиотека ZeroMQ, я часто использую ее очереди, а сообщения пересылаю с помощью протокола inproc той же самой библиотеки ZeroMQ: легко, быстро, безопасно. К тому же еще и кроссплатформенно. :) А также практически бескровно можно перейти от inter-thread сообщений к inter-process и inter-computer (в локальной сети). Детали реализации, в общем, несущественны. Ну вот. Отвлек меня. :) Я об изоляции кодирования конкретной задачи. Если изоляция на уровне процессов не вызывает сомнений и затруднений (хотя, кто-то все же норовит заюзать систему синхронизации для доступа к разделяемым ресурсам), то при кодировании задачи на уровне треда сплошь и рядом наблюдаем попытки реализовать синхронизацию доступа к общим ресурсам с использованием всяких непотребств, в результате часто в лучшем случае вместо распараллеливания получаем кооперативную квазипараллельность, а в худшем - "непонятное" поведение многонитевого приложения. Нарабатываются методики обхода, но ведь всего лишь достаточно использовать сообщения и очереди ("системные" или "самодельные"). В большинстве случаев, имхо. Нездоровые случаеи погони за ложными целями типа "оптимизация ради оптимизации", о которых лучше не упоминать, я не упоминаю. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 01:39 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
Кстати интересно, как вы видите решение следующей задачи Есть потоки-эмиттеры, которые херачат «сообщения», которые в дальнейшем обрабатывают потоки-обработчики. Причём потоки-эмиттеры сами могут быть потоками-обработчиками каких-то других сообщений. Типичная реализация конвейера. Как я себе это вижу. Между потоками-эмиттерами и потоками-обработчиками должна быть лок-фри очередь «сообщений». Поток-обработчик берёт элемент очереди, если нифига не получил - значит простаивает. Так вот мне интересно, кто как организовывает это простаивание. Можно разу идти на новую итерацию, можно сделать pause, можно SwitchToThread (как это в POSIX?), можно делать Sleep(0) или Sleep(1) Лично я делаю счётчик, и в зависимости от счётчика простоя - вызываю тот или иной метод. Кто что думает? Мне данный простой вообще не нравится. Какой-то он не умный. Говорят, в новых виндах есть ивент на модификацию памяти. Но не понятно, насколько он эффективен. И нужно кроссплатформенное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 10:18 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
Как венда работает - непостижимо. У ней внутре потоков больше, чем звезд на небе и менеджеров памяти, кроме Heap-функций нету... Напридумывают себе гамаков, а потом трудности мужественно преодолевают. Все вроде уже написано, включая обход подводных граблей, в http://www.sql.ru/forum/781947/nayti-v-pdf-knigu-multithreading-the-delphi-way-martin-harvey ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 10:42 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, У меня есть многопоточный список строк для чего-то подобного. Поток, принимающий сообщения, просто засыпает в ожидании строки в списке: Код: pascal 1. 2. 3. 4. авторВсе вроде уже написано, включая обход подводных граблей, в Многое уже придумано до нас. Только что вместо того, что бы изучать предмет выдумывают гору своих костылей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 12:06 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUПоток-обработчик берёт элемент очереди, если нифига не получил - значит простаивает. Так вот мне интересно, кто как организовывает это простаивание. Можно разу идти на новую итерацию, можно сделать pause, можно SwitchToThread (как это в POSIX?), можно делать Sleep(0) или Sleep(1)Не совсем понимаю, почему не подходит обычный event (который взводится при добавлении нового элемента в общую очередь) и waitfor на него во всех потоках-оброботчиках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 12:09 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
YuRockобщую очередьНеправильно выразился. Тут же не очередь, а список заданий, как я понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 12:11 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
schiКак венда работает - непостижимо. У ней внутре потоков больше, чем звезд на небе и менеджеров памяти, кроме Heap-функций нету... Напридумывают себе гамаков, а потом трудности мужественно преодолевают. Все вроде уже написано, включая обход подводных граблей, в http://www.sql.ru/forum/781947/nayti-v-pdf-knigu-multithreading-the-delphi-way-martin-harvey Действительно, непостижимо. Обнаружив в теме что-то знакомое (хоть слово), некоторые люди стараются сразу же в этой теме отметиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 13:46 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
YuRockНе совсем понимаю, почему не подходит обычный event возможно из-за экономии на sysenter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 15:09 |
|
||
|
Оформление кода multi-thread приложения.
|
|||
|---|---|---|---|
|
#18+
kep-koYuRockНе совсем понимаю, почему не подходит обычный event возможно из-за экономии на sysenter.Sleep дает эту экономию? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 15:37 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39623812&tid=2041060]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
208ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 598ms |

| 0 / 0 |
