OberonCore https://forum.oberoncore.ru/ |
|
Мультипоточность в BlackBox https://forum.oberoncore.ru/viewtopic.php?f=2&t=3407 |
Страница 1 из 2 |
Автор: | ilovb [ Понедельник, 18 Апрель, 2011 08:18 ] |
Заголовок сообщения: | Мультипоточность в BlackBox |
Вопрос Илье Ермакову: С какими проблемами можно столкнуться при работе с тредами через WinAPI? Интересуют не классические проблемы, а специфические для BlackBox. Заранее спасибо |
Автор: | Илья Ермаков [ Вторник, 19 Апрель, 2011 10:15 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Уважаемый ilovb, я обязательно отвечу Вам, но чуть позже, может быть, завтра. |
Автор: | Алексей Елин [ Вторник, 19 Апрель, 2011 10:18 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Сборщик мусора BB не умеет делать многопоточный Stop-The-World. Соответственно при сборке мусора в одном из потоков могут появиться (с большой вероятностью) висячие ссылки. А потом программа "навернется" в случайном месте. |
Автор: | Илья Ермаков [ Среда, 20 Апрель, 2011 15:01 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Потоки могут спокойно работать только в одном случае - если они вообще не работают с динамическими объектами КП. Т.е. POINTER TO не используется ни прямо, ни косвенно (при вызове каких-то модулей). Можно использовать POINTER [untagged] и работать с кучей Windows. В случае нормальном потоки использовать нельзя. Это приведёт к мгновенному сбою, раньше, чем указал Алексей, гарантированно. Во-первых, при маркировке объектов сборщик не учтёт якоря в стеках потоков и просто их соберёт. Во-вторых, всё ещё хуже: когда сборщик маркирует объекты, он делает нечётным их тег типа (значение по смещению -4 от адреса объекта). Таким образом, любой код, который параллельно с маркировкой попробует использовать тег типа какого-нибудь объекта (а это нужно при вызове функций, или при WITH и т.п.), тут же "гавкнется" с ошибкой. Эти проблемы были решены в Active BlackBox, в нём ядро поддерживает потоки. Он сейчас снят с публикации (как концептуально неперспективный), но препятствий к его использованию, "если припёрло", нет. Могу передать Вам дистрибутив. Но оно под 1.5. |
Автор: | ilovb [ Среда, 20 Апрель, 2011 15:27 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Спасибо за ответ. Active BlackBox у меня есть. |
Автор: | Алексей Елин [ Среда, 20 Апрель, 2011 16:18 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Илья, а Active BlackBox использует stop-the-world подходи или пользуется какой то другой техникой? И если это stop-the-world, то как собираются якоря из стектов потоков? |
Автор: | Илья Ермаков [ Среда, 20 Апрель, 2011 16:54 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Да, сборщик замораживает все потоки. Потоки нельзя создавать с помощью WinApi. Нужно использовать функцию создания потока, которая введена в модуль Kernel. Тогда ядро будет знать про поток и корректно обрабатывать его стек при сборке мусора. У Вас АББ с исходниками? |
Автор: | Алексей Елин [ Среда, 20 Апрель, 2011 19:12 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
К сожалению у меня его нет. |
Автор: | Илья Ермаков [ Среда, 20 Апрель, 2011 20:53 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Пардон, не заметил, что вопрос от Вас, а не от автора темы. Если нужно, можно организовать. |
Автор: | QWERTYProgrammer [ Среда, 20 Апрель, 2011 21:40 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Илья Ермаков писал(а): Эти проблемы были решены в Active BlackBox... Он сейчас снят с публикации (как концептуально неперспективный)... Как-то уже забылось, не могли бы напомнить, в чем именно заключается неперспективность? |
Автор: | Илья Ермаков [ Четверг, 21 Апрель, 2011 12:53 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Вообще в идее иметь несколько потоков в одной среде. Для технических нужд, конечно, это может быть полезно; программировать так прикладную задачу - нет. В общем, не нравится он мне. Авторское право Но если кто-то хочет использовать, с пониманием, что это просто частное техническое решение, то я, конечно, не против. |
Автор: | Сергей Губанов [ Четверг, 21 Апрель, 2011 13:00 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Просто виноград зелёный. Не поспел ещё. Кислый наверное. |
Автор: | Александр Ильин [ Четверг, 21 Апрель, 2011 13:06 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Недавно дали программку на Дельфи. Там основная нить работает с интерфейсом, как обычно, а параллельная нить - с COM-портом работает в блокирующем режиме. Обмен данными - через группу глобальных переменных. Достаточно чистый и понятный код в результате. |
Автор: | ilovb [ Четверг, 21 Апрель, 2011 13:26 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Сергей Губанов писал(а): Просто виноград зелёный. Не поспел ещё. Кислый наверное. ??? |
Автор: | Илья Ермаков [ Четверг, 21 Апрель, 2011 13:49 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Сергей Губанов писал(а): Просто виноград зелёный. Не поспел ещё. Кислый наверное. В каком смысле? Нет, я не против потоков, как системного средства. Но в целом наличие многих потоков в одном объектном пространстве плохо сказывается на структуре системы. Например, постоянная боязнь состояния модулей - это ведёт к усложнению системы. В Оберонах есть ряд паттернов, базирующихся на таком состоянии (и у меня есть ещё ряд своих решений на этом же). Например, DevCommanders.par или Views.Deposit - такого рода "буферы" для взаимодействия компонентов. Кто-то скажет, что это маскирует "негибкость" способов передать и вернуть параметры и т.п., но нафиг мне гибкость, если она тянет за собой сложность системы типов и т.п. Лучше я буду знать, что в рамках одного множества модулей и одной кучи "шурует" только один поток. Я за такой подход: - если задачи сильно независимы, то отдельными процессами; - иначе грузить в одно адресное пространство несколько Оберон-сред, по числу необходимых потоков. Обмениваться между ними нетипизированными двоичными данными. |
Автор: | Пётр Кушнир [ Четверг, 21 Апрель, 2011 14:52 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Тогда нужен механизм удобного оперирования этими Оберон-средами. Ядро, которое умеет запускать ядра? вариант с запуском N приложений я не рассматриваю, он какой-то варварский |
Автор: | Алексей Елин [ Четверг, 21 Апрель, 2011 15:10 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Желательно не только запустить несколько ядер, но и организовать абстрагированные от реализации каналы обмена двоичными данными. Тогда можно реализовать несколько режимов: - с разными процессами и каналами на основе memory mapped files (легко реализовать, но не очень эффективно) - с несколькими ядрами в разных потоках одного процесса и каналами в untagged куче (сложно, эффективно) - с несколькими процессами и каналами на основе IP (можно организовывать кластера ) а также их комбинации... |
Автор: | Сергей Губанов [ Четверг, 21 Апрель, 2011 15:10 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Многопоточность не означает что любому потоку разрешено соваться в любое место. У меня на работе в программе глобальное пространство объектов поделено на объектные подпространства. Взаимодействие между ними осуществляется через очереди сообщений (точнее - указателей на сообщения). Вызов процедуры для манипулирования объектами из чужого потока карается возбуждением исключения в потоке-нарушителе. > Например, DevCommanders.par или Views.Deposit - такого рода "буферы" для взаимодействия компонентов. В них надо расставить ASSERTы на исполнимость только, например, из главного потока ББ. Пусть процедура Threading.GetCurrentThreadId() возвращает целое число - номер потока из которого она вызвана (все потоки перенумерованы). Если манипулирование какими-то данными допускается только из потока с номером t1, тогда в начало соответствующих процедур вставьте такой код: Код: PROCEDURE Procedure (); Аналог этой проверки на C#: BEGIN ASSERT(Threading.GetCurrentThreadId() = t1); ... Код: if (System.Threading.Thread.CurrentThread.ManagedThreadId != this.threadId) Код "if (System.Threading.Thread.CurrentThread.ManagedThreadId != this.threadId)" выполняется тактов за пять. То есть практически бесплатно можно осуществлять (динамический) контроль потокобезопасности в объектных подпространствах.
{ throw new System.InvalidOperationException("threadsafe violation"); } |
Автор: | Илья Ермаков [ Четверг, 21 Апрель, 2011 15:31 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Пётр Кушнир писал(а): Тогда нужен механизм удобного оперирования этими Оберон-средами. Ядро, которое умеет запускать ядра? Именно так и делается |
Автор: | Пётр Кушнир [ Четверг, 21 Апрель, 2011 15:51 ] |
Заголовок сообщения: | Re: Мультипоточность в BlackBox |
Где делается? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |