LINUX.ORG.RU

Обновился инструмент для работы с агентами в C++: SObjectizer 5.5.15

 , , ,


0

2

SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++11 за счет использования идей из моделей акторов и publish-subscribe. SObjectizer является OpenSource-проектом и распространяется под трехпунктной BSD-лицензией.

Этот релиз добавляет возможность создания агентов в виде иерархических конечных автоматов. В версии 5.5.15 поддерживаются такие вещи, как композитные состояния, shallow- и deep-история, обработчики входа/выхода, лимиты времени, передача события на обработку в другое состояние (что-то вроде defer) и подавление событий.

Малюсенький примерчик для демонстрации новых возможностей: агент, который реализует мигающий LED-индикатор. Этот агент обрабатывает сигнал turn_on_off для включения и выключения режима мигания. Когда режим мигания включен, агент зажигает LED-индикатор на 1.5 секунды, затем тушит его на 0.75 секунды, затем опять зажигает и опять тушит и так до тех пор, пока не получит следующий сигнал turn_on_off.

Код этого агента может выглядеть вот так:

class blinking_led final : public so_5::agent_t
{
	state_t off{ this },
		blinking{ this },
		blink_on{ initial_substate_of{ blinking } },
		blink_off{ substate_of{ blinking } };

public :
	struct turn_on_off : public so_5::signal_t {};

	blinking_led( context_t ctx ) : so_5::agent_t{ ctx }
	{
		this >>= off;

		off.just_switch_to< turn_on_off >( blinking );

		blinking.just_switch_to< turn_on_off >( off );

		blink_on
			.on_enter( []{ /* some device-specific code */ } )
			.on_exit( []{ /* some device-specific code */ } )
			.time_limit( std::chrono::milliseconds{1500}, blink_off );

		blink_off
			.time_limit( std::chrono::milliseconds{750}, blink_on );
	}
};

Взять версию 5.5.15 можно либо из раздела Files на SouceForge, либо из Svn репозитория, либо из зеркала на GitHub.

★★★★★

Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Зачем посылать кому-то «сообщение» чтобы он что-то сделал, либо стопнул, если проще это сделать, либо стопнуть. Не?

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

Насколько я понимаю, архитектура с агентами появилась, чтобы упростить разработку сложных многопоточных приложений, когда архитектура с простыми блокировками становится слишком сложной. Попробуй продумать логику блокировок, когда у тебя не приложение типа производитель-потребитель с одной очередью, а таких очередей, которые нужно блокировать штуки 3, для разных операций нужно блокировать какой-то набор очередей, возможно, заранее неизвестно какой, либо даже все одновременно. Ты довольно быстро поймешь, что либо там будет глобальная блокировка, либо при очередном изменении функционала ты что-нибудь не учтешь и у тебя возникнут либо гонки, либо дедлоки, либо, если совсем не попрет, лайвлоки. Вот можешь просветиться насчет разных моделей конкурентного/параллельного программирования http://it-ebooks.info/book/3758/.

anonymous
()
Ответ на: комментарий от anonymous

Вменяемый аноним на LOR-е! Спасиб, тебе, добрый человек!

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

eao197 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Это имеет смысл в многопоточном приложении. Когда разные агенты работают на разных потоках, например, из соображений производительности, чтобы использовать все ресурсы CPU.

Ахренеть, а пацаны-то не знали, что в 21веке есть потоки.

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

Чё?

Поэтому каждый агент работает только на одном потоке (возможно сейчас на одном, а чуть позднее на другом, но в один момент времени только на одном и, поэтому код агента полностью однопоточный) (есть одно исключение, когда явно помеченный агент может одновременно работать на разных потоках одновременно), другой агент в это время может работать на другом потоке.

Чё?

Ты понимаешь, что когда твой недоагент работает, то он не может отвечать, а если он отвечает, то как? Значит он либо будет стопать, либо ждать завершения, но я тебя удивлю - это обычный worker-pool.

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

У меня такое ощущение, что ты нихрена не понимаешь в том, о чём говоришь.

Я там выше спрашивал про мейл-сервер. Опиши его работу на своим «агентах», опиши работу чего-либо на своих агентах, если не осилиться с этим.

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

Меня не интересует этот маркетинговый булшит. Такую херню толкают ламеркам за партами, либо при попытке впарить.

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

Попробуй продумать логику блокировок, когда у тебя не приложение типа производитель-потребитель с одной очередью, а таких очередей, которые нужно блокировать штуки 3, для разных операций нужно блокировать какой-то набор очередей, возможно, заранее неизвестно какой, либо даже все одновременно. Ты довольно быстро поймешь, что либо там будет глобальная блокировка, либо при очередном изменении функционала ты что-нибудь не учтешь и у тебя возникнут либо гонки, либо дедлоки, либо, если совсем не попрет, лайвлоки.

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

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

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

Я могу просто на каждую твою «нужно блокировать» могу сказать «не нужно блокировать» и ты обделаешься. Тут же и убежишь плакаться мамке. Зачем ты мне пишешь эту херню?

anonymous
()
Ответ на: комментарий от eao197

Вменяемый аноним на LOR-е! Спасиб, тебе, добрый человек!

Этот аноним - убогая жертва пропаганды, которая обделается на первом же сообщении.

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

Ога, смешно. Ну выкати мне любую херню на своей недолибе - я обоссу её руками на одном потоке. Естественно херню, кторую можно проверить.

Давай, возможно ты сможешь подумать. Вот смотри - ты сейчас сказал, что не надо ручных операций и освобождении памяти. Я тебя удивлю, но их не надо ни в одной из реализаций любого многопоточного фреймворка, с любой моделью - абсолютно. Вон ты кукарекал про tbb - нету никаких локовруками - просто паралельные структуры и алгоритмы.

И теперь внимание вопрос - чем твоя модель лучше другой? А я тебе отвечу - не лучше - она дерьмо бесполезно, а как дело доходит до «зачем нужна» любая ламерюжка пытается прятаться за понянием «фреймворк для паралельного праграммирования», приписывая себе все его плюсы, при этом эти плюсы есть у любого и не стоят ничего.

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

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

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

Это просто топчик.

anonymous
()
Ответ на: комментарий от anonymous

Ну выкати мне любую херню на своей недолибе - я обоссу её руками на одном потоке.

Царь, всем давно известно, что вам ничего не нужно, вы все можете сделать сами и так, что рядом с вашим кодом ничего не стоит. Ваше величие непререкаемо и не обсуждаемо.

Посему покиньте эту тему, пожалуйста, оставьте это простым смертным, которые не могут понять, как обойтись без сотни рабочих потоков в процессе. И как справится с этим без вспомогательных инструментов.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Царь, всем давно известно, что вам ничего не нужно, вы все можете сделать сами и так, что рядом с вашим кодом ничего не стоит. Ваше величие непререкаемо и не обсуждаемо.

Давай ради интереса знаешь что сделаем? Возьмём 400твоих куллагентов и сунем им какую-то работу, а после измерим время, за которые они все 400отработают и сравним поделим на время задачи. Пошля им всем сигнал «делать».

Я тебе могу гарантировать, что мы получим х10 от времени чистой работы. Сделай пж.

Сделай мне 400 агентов и оповещалку им - я сделаю всё остальное. Ну чтоб ты мне не кукарекал, что я как-то неправильно заюзал твою куллибу, а когда я получу х10 - ты будешь мне говорить «ты всё нетак сделал», а когда я тебя спрошу «покажи как» - будешь так же кукарекать «мне некогда, время не ждёт»

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.