OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 01:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Мультипоточность в BlackBox
СообщениеДобавлено: Понедельник, 18 Апрель, 2011 08:18 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Вопрос Илье Ермакову:

С какими проблемами можно столкнуться при работе с тредами через WinAPI?
Интересуют не классические проблемы, а специфические для BlackBox.

Заранее спасибо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Вторник, 19 Апрель, 2011 10:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Уважаемый ilovb, я обязательно отвечу Вам, но чуть позже, может быть, завтра.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Вторник, 19 Апрель, 2011 10:18 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Сборщик мусора BB не умеет делать многопоточный Stop-The-World. Соответственно при сборке мусора в одном из потоков могут появиться (с большой вероятностью) висячие ссылки. А потом программа "навернется" в случайном месте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Среда, 20 Апрель, 2011 15:01 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Потоки могут спокойно работать только в одном случае - если они вообще не работают с динамическими объектами КП.
Т.е. POINTER TO не используется ни прямо, ни косвенно (при вызове каких-то модулей).
Можно использовать POINTER [untagged] и работать с кучей Windows.

В случае нормальном потоки использовать нельзя. Это приведёт к мгновенному сбою, раньше, чем указал Алексей, гарантированно. Во-первых, при маркировке объектов сборщик не учтёт якоря в стеках потоков и просто их соберёт. Во-вторых, всё ещё хуже: когда сборщик маркирует объекты, он делает нечётным их тег типа (значение по смещению -4 от адреса объекта). Таким образом, любой код, который параллельно с маркировкой попробует использовать тег типа какого-нибудь объекта (а это нужно при вызове функций, или при WITH и т.п.), тут же "гавкнется" с ошибкой.

Эти проблемы были решены в Active BlackBox, в нём ядро поддерживает потоки. Он сейчас снят с публикации (как концептуально неперспективный), но препятствий к его использованию, "если припёрло", нет. Могу передать Вам дистрибутив. Но оно под 1.5.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Среда, 20 Апрель, 2011 15:27 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Спасибо за ответ.
Active BlackBox у меня есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Среда, 20 Апрель, 2011 16:18 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Илья, а Active BlackBox использует stop-the-world подходи или пользуется какой то другой техникой?
И если это stop-the-world, то как собираются якоря из стектов потоков?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Среда, 20 Апрель, 2011 16:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, сборщик замораживает все потоки.

Потоки нельзя создавать с помощью WinApi. Нужно использовать функцию создания потока, которая введена в модуль Kernel. Тогда ядро будет знать про поток и корректно обрабатывать его стек при сборке мусора.

У Вас АББ с исходниками?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Среда, 20 Апрель, 2011 19:12 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
К сожалению у меня его нет. :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Среда, 20 Апрель, 2011 20:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Пардон, не заметил, что вопрос от Вас, а не от автора темы. Если нужно, можно организовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Среда, 20 Апрель, 2011 21:40 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Илья Ермаков писал(а):
Эти проблемы были решены в Active BlackBox... Он сейчас снят с публикации (как концептуально неперспективный)...

Как-то уже забылось, не могли бы напомнить, в чем именно заключается неперспективность?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 12:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вообще в идее иметь несколько потоков в одной среде. Для технических нужд, конечно, это может быть полезно; программировать так прикладную задачу - нет.

В общем, не нравится он мне. Авторское право :) Но если кто-то хочет использовать, с пониманием, что это просто частное техническое решение, то я, конечно, не против.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 13:00 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Просто виноград зелёный. Не поспел ещё. Кислый наверное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 13:06 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Недавно дали программку на Дельфи. Там основная нить работает с интерфейсом, как обычно, а параллельная нить - с COM-портом работает в блокирующем режиме. Обмен данными - через группу глобальных переменных. Достаточно чистый и понятный код в результате.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 13:26 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Сергей Губанов писал(а):
Просто виноград зелёный. Не поспел ещё. Кислый наверное.

???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 13:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Сергей Губанов писал(а):
Просто виноград зелёный. Не поспел ещё. Кислый наверное.


В каком смысле?

Нет, я не против потоков, как системного средства.

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

В Оберонах есть ряд паттернов, базирующихся на таком состоянии (и у меня есть ещё ряд своих решений на этом же). Например, DevCommanders.par или Views.Deposit - такого рода "буферы" для взаимодействия компонентов. Кто-то скажет, что это маскирует "негибкость" способов передать и вернуть параметры и т.п., но нафиг мне гибкость, если она тянет за собой сложность системы типов и т.п. Лучше я буду знать, что в рамках одного множества модулей и одной кучи "шурует" только один поток.

Я за такой подход:
- если задачи сильно независимы, то отдельными процессами;
- иначе грузить в одно адресное пространство несколько Оберон-сред, по числу необходимых потоков. Обмениваться между ними нетипизированными двоичными данными.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 14:52 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Тогда нужен механизм удобного оперирования этими Оберон-средами. Ядро, которое умеет запускать ядра?
вариант с запуском N приложений я не рассматриваю, он какой-то варварский


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 15:10 

Зарегистрирован: Суббота, 28 Январь, 2006 00:10
Сообщения: 52
Откуда: г. Киров
Желательно не только запустить несколько ядер, но и организовать абстрагированные от реализации каналы обмена двоичными данными.
Тогда можно реализовать несколько режимов:
- с разными процессами и каналами на основе memory mapped files (легко реализовать, но не очень эффективно)
- с несколькими ядрами в разных потоках одного процесса и каналами в untagged куче (сложно, эффективно)
- с несколькими процессами и каналами на основе IP (можно организовывать кластера :!: )
а также их комбинации...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 15:10 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Многопоточность не означает что любому потоку разрешено соваться в любое место.

У меня на работе в программе глобальное пространство объектов поделено на объектные подпространства. Взаимодействие между ними осуществляется через очереди сообщений (точнее - указателей на сообщения). Вызов процедуры для манипулирования объектами из чужого потока карается возбуждением исключения в потоке-нарушителе.

> Например, DevCommanders.par или Views.Deposit - такого рода "буферы" для взаимодействия компонентов.

В них надо расставить ASSERTы на исполнимость только, например, из главного потока ББ.

Пусть процедура Threading.GetCurrentThreadId() возвращает целое число - номер потока из которого она вызвана (все потоки перенумерованы). Если манипулирование какими-то данными допускается только из потока с номером t1, тогда в начало соответствующих процедур вставьте такой код:
Код:
PROCEDURE Procedure ();
BEGIN
  ASSERT(Threading.GetCurrentThreadId() = t1);
  ...
Аналог этой проверки на C#:
Код:
if (System.Threading.Thread.CurrentThread.ManagedThreadId != this.threadId)
{
  throw new System.InvalidOperationException("threadsafe violation");
}
Код "if (System.Threading.Thread.CurrentThread.ManagedThreadId != this.threadId)" выполняется тактов за пять. То есть практически бесплатно можно осуществлять (динамический) контроль потокобезопасности в объектных подпространствах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 15:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Пётр Кушнир писал(а):
Тогда нужен механизм удобного оперирования этими Оберон-средами. Ядро, которое умеет запускать ядра?


Именно так и делается :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Мультипоточность в BlackBox
СообщениеДобавлено: Четверг, 21 Апрель, 2011 15:51 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Где делается?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB