LINUX.ORG.RU

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

 , , ,


4

1

SObjectizer — это реализация модели акторов для C++, позволяющая программировать на C++ с использованием работающих на разных нитях агентов, общающихся между собой посредством сообщений. SObjectizer существенно упрощает разработку событийно-ориентированных приложений, для параллельной и независимой обработки событий в которых требуется многопоточность и/или распределенность. SObjectizer использовался для создания как для мелких утилит, так и серьезных распределенных приложений, работающих под большой нагрузкой в режиме 24x7.

Последние несколько лет SObjectizer развивается на SourceForge как OpenSource проект под BSD-лицензией. Подробнее об истории, текущем состоянии и направлении движения SObjectizer можно прочитать здесь.

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

Главное отличие v.5.5.0 от предыдущих версий — это отсутствие зависимости от ACE Framework. Т.е. теперь ACE в коде ядра SObjectizer не используется вообще, для SObjectizer достаточно наличия стандартной библиотеки C++11. Это означает, что SObjectizer уменьшился в размере, нужно меньше времени на сборку SObjectizer-проектов, упрощается поддержка различных компиляторов и платформ. В частности, эта версия SObjectizer тестировалась посредством MSVS2013 (Windows), GCC 4.8/4.9 (Windows, Linux), Clang 3.5.0 (Linux).

Из более мелких изменений можно отметить прямую поддержку std::chrono при работе с отложенными/периодическими сообщениями, а так же небольшое изменение названий некоторых классов/функций (с сохранением старых имен для обеспечения совместимости). Более подробная информация о нововведениях в v.5.5.0 доступна в соответствующем разделе Wiki проекта. Так же увеличилось количество страниц с описаниями базовых вещей SObjectizer.

Версия 5.5.0 может быть загружена из раздела Files или получена из Subversion-репозитория.

Примечание. Этот релиз содержит только ядро SObjectizer (т.е. проект so_5). Никакие другие подпроекты (вроде so_log или so_sysconf) в релиз не включены. Возможно, сборка SObjectizer Assembly со всеми подпроектами будет сформирована и опубликована позже (если она действительно кому-то потребуется).

PS. Анонс делается просто для того, чтобы уведомить, что такой проект есть, живет, развивается. Доступен под BSD-лицензий, т.е. даром, в том числе и для коммерческих проектов. Это не просьба сделать code review. И не попытка кому-то что-то «продать».

PPS. Специально для желающих постебаться над синтаксисом и посравнивать программирование на C++ с Perl-ом. Вот классический пример Hello, World. В традиционном, ООП-шном варианте, с созданием класса агента и переопределением виртуальных методов (хотя есть и более модерновый вариант, с использованием С++ных лямбда-функций):

#include <iostream>

// Main SObjectizer header files.
#include <so_5/all.hpp>

// Definition of an agent for SObjectizer.
class a_hello_t : public so_5::rt::agent_t
{
	public:
		a_hello_t( so_5::rt::environment_t & env )
			: so_5::rt::agent_t( env )
		{}

		// A reaction to start of work in SObjectizer.
		virtual void
		so_evt_start() override
		{
			std::cout << "Hello, world! This is SObjectizer v.5."
				<< std::endl;

			// Shutting down SObjectizer.
			so_environment().stop();
		}

		// A reaction to finish of work in SObjectizer.
		virtual void
		so_evt_finish() override
		{
			std::cout << "Bye! This was SObjectizer v.5."
				<< std::endl;
		}
};

int
main( int, char ** )
{
	try
	{
		// Starting SObjectizer.
		so_5::launch(
			// A function for SO Environment initialization.
			[]( so_5::rt::environment_t & env )
			{
				// Creating and registering single agent as a cooperation.
				env.register_agent_as_coop( "coop", new a_hello_t( env ) );
			} );
	}
	catch( const std::exception & ex )
	{
		std::cerr << "Error: " << ex.what() << std::endl;
		return 1;
	}

	return 0;
}

PPPS. Специально для желающих узнать, чем SObjectizer лучше libcppa/CAF. В двух словах — это две совершенно разные разработки, ставящие перед собой разные цели и достигающие их разными способами. Подробнее здесь и здесь.

★★★★★

Последнее исправление: beastie (всего исправлений: 2)

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

Бл*, размер вашего долбо*бизма поражает меня все больше и больше. Я уж думал, что после перла про самодельный Erlang мы уже достигли дна. Но тут вы умудрились очень громко постучать снизу. Смотрим на описание задачи из CSP:

In ancient times, a wealthy philanthropist endowed a College to accommodate five eminent philosophers. Each philosopher had a room in which he could engage in his professional activity of thinking; there was also a common dining room, furnished with a circular table, surrounded by five chairs, each labelled by the name of the philosopher who was to sit in it. The names of the philosophers were PHIL0, PHIL1, PHIL2, PHIL3, PHIL4, and they were disposed in this order anticlockwise around the table. To the left of each philosopher there was laid a golden fork, and in the centre stood a large bowl of spaghetti, which was constantly replenished.

A philosopher was expected to spend most of his time thinking; but when he felt hungry, he went to the dining room, sat down in his own chair, picked up his own fork on his left, and plunged it into the spaghetti. But such is the tangled nature of spaghetti that a second fork is required to carry it to the mouth. The philosopher therefore had also to pick up the fork on his right. When we was finished he would put down both his forks, get up from his chair, and continue thinking. Of course, a fork can be used by only one philosopher at a time. If the other philosopher wants it, he just has to wait until the fork is available again.

Если вы отбросите весь этот bla-bla-bla про думание в отдельных комнатах, то увидите, что в Wikipedia (а также на соответствующих курсах в советских ВУЗах) давали самую суть этой проблемы: как раздавать вилки уже сидящим за столом философам так, чтобы никто из них не голодал слишком долго. То, что философы делают вне обеденного стола к проблеме обедающих философов совершенно не относится.

Поэтому и мой вопрос был в том, следует ли тесту имитировать какую-то деятельность философов, когда они не хотят есть? Т.е., должен ли цикл работы философа быть «что-то делаю; жду вилок; ем» или же нужно сократить его до минимально необходимого для данной проблемы: «жду вилок; ем».

Вы говорите про Think, Eat. Хотя получается, что подразумеваете Think, Wait Forks, Eat.

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

A philosopher was expected to spend most of his time thinking; but when he felt hungry...

When we was finished he would put down both his forks, get up from his chair, and continue thinking.

м?

что философы делают вне обеденного стола к проблеме обедающих философов совершенно не относится.

с тобой весело, каждый день можно узнать что-то новое...

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

м?
с тобой весело, каждый день можно узнать что-то новое...

Вы пользуйтесь случаем, а то так дураком и помрете.

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

Повторюсь — это и есть суть. Она очень точно, ясно и лаконично зафиксирована в Wiki.

Более подробное описание у Хоара — это попытка объяснить суть проблемы несведующим людям (а CSP появилась как результат лекционных курсов Хоара). Отсюда и появляется дополнительная детализация вроде отдельных комнат и какой-то деятельности вне обеденного стола.

Однако то, чем занимаются философы вне обеденного стола к алгоритму раздачи им вилок за обеденным столом не имеет никакого значения. Суть же проблемы — именно в данном алгоритме.

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

Вы говорите про Think, Eat. Хотя получается, что подразумеваете Think, Wait Forks, Eat.

вот тебе небольшой мастер-класс по проектированию удобных в использовании интерфейсов.

сделай класс с двумя абстрактными методами: Think() и Eat(). пользователь должен унаследоваться от него и переопределить их. в Think() находится основная часть его программы. когда надо выполнить код с использованием общих ресурсов, он зовёт из базового класса IAmHungry(), что приводит к корректному вызову Eat().

не благодари.

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

вот тебе небольшой мастер-класс по проектированию удобных в использовании интерфейсов.

Спасибо, поржал.

Кроме ООП еще о каких-нибудь подходах к проектированию слышали?

сделай класс с двумя абстрактными методами: Think() и Eat(). пользователь должен унаследоваться от него и переопределить их. в Think() находится основная часть его программы. когда надо выполнить код с использованием общих ресурсов, он зовёт из базового класса IAmHungry(), что приводит к корректному вызову Eat().

Походу, вы можете сформулировать задание только когда вам все на пальцах объяснят.

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

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

вы можете сформулировать задание только когда вам все на пальцах объяснят.

пока что объяснять на пальцах приходится мне

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

пока что объяснять на пальцах приходится мне

Ну вы же взялись задачи ставить. Кому же еще?

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

Я же не телепатию не претендую, в отличии от вас. Мне приходится ваше видение задачи множеством вопросов из вас вытаскивать. Что, при общении с тимлидом вызывает серьезное недоумение. Уж чему-чему, а растолковыванию и формализации задач вы должны были бы научиться.

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

ты задал глупый вопрос (про sleep), и тем не менее получил на него развёрнутый ответ.

делать именно такой интерфейс тебя никто не заставляет. посмотрим на твой, не объектно-ориентированный.

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

ты задал глупый вопрос (про sleep), и тем не менее получил на него развёрнутый ответ.

Какая была формулировка задачи, такие были и вопросы.

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

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

ещё раз извини. я всё время забываю, что говорить с тобой надо как с маленьким ребёнком — иначе не доходит.

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

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

как с маленьким ребёнком

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

А за очередную апелляцию к

издержки психического развития

вы иначе как именования мудозвона не заслуживаете.

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

А за очередную апелляцию к

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

у кого из вас когнитивные расстройства?

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

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

Еще раз перечитайте вот это.

Речь идет о том, что у Хоара описана одна из интерпретаций проблемы обедающих философов, более многословная. Тогда как в Wiki излагается сама суть этой проблемы, без лишней «воды». О чем мне пришлось вам говорить дважды.

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

одна из интерпретаций проблемы обедающих философов

дык ты ещё и его авторство не признаёшь?

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

дык ты ещё и его авторство не признаёшь?

А с чего бы вдруг?

It was originally formulated in 1965 by Edsger Dijkstra as a student exam exercise, presented in terms of computers competing for access to tape drive peripherals. Soon after, Tony Hoare gave the problem its present formulation.

eao197 ★★★★★
() автор топика

Собственно, вот реализация задачи обедающих философов с использованием арбитра: http://pastebin.com/HaThB3Yz — там самодостаточный код, не имеющий никаких внутренних проверок. Получен вот из этого варианта, в котором есть и отладочные печати (если сохранен дефайн ENABLE_TRACE), и самопроверки внутри арбитра (если сохранен дефайн USE_SELF_CHECK).

Пример содержит два типа агентов:

  • арбитр, который следит за состоянием вилок и раздает разрешения философам начать обедать. Так же он завершает работу примера по истечении заданного времени;
  • философ, который что-то делает (метод think()), затем отсылает запрос арбитру за разрешением поесть, дожидается разрешения, ест (метод eat()), сообщает арбитру о завершении приема пищи, опять уходит в think().

Агент-философ для того, чтобы поесть, отсылает запрос msg_start_eating_request арбитру. После чего ждет разрешения в виде сигнала msg_start_eating. Получив этот сигнал агент вызывает метод eat(). После возвращения из eat() арбитру отсылается сообщение msg_eating_finished. После чего агент уходит в think(). И так по бесконечному кругу.

Арбитр хранит у себя вектор с состояниями вилок. Каждая вилка может быть занятой или свободной. Если вилка занята, кто кто-то может ожидать ее освобождения.

Разрешение философу поесть выполняется следующим образом:

  • сначала проверяется свободна ли левая вилка для философа. Если занята, то помечается, что у этой вилки есть ожидающий ее освобождения философ и обработка запроса прекращается. Если же вилка свободна, то она помечается как занятая;
  • затем проверяется правая вилка. Если она занята, то помечается, что у этой вилки есть ожидающий ее освобождения философ и обработка запроса прекращается. Если же вилка свободна, то она помечается как занятая;
  • если обработка запроса дошла до этой стадии, значит обе вилки отданы философу и ему разрешается поесть.

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

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

Насколько я смог понять, данный алгоритм защищен от тупиков (за счет централизованного распределения вилок) и голоданий философов (за счет наличия информации об ожидании). Хотя, в принципе, не является самым оптимальным в плане распределения ресурсов, т.к. левая вилка, если она была свободна, захватывается всегда. И уже не может быть отдана левому соседу, даже если она ему нужна в качестве правой (т.е. возможна ситуация, когда из пяти философов четверо ждут пятого, например, вот такое распределение состояний: «W,W,W,E,W», где W — это ожидание разрешения от арбитра).

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

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

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

наркоман? приводишь цитату явно противоречащую твоим утверждениям.

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

ты старался. сколько времени потратил? честно?

поэтому я сделал как ты любишь: на 11-х крестах «переносимо»

#include <condition_variable>
#include <iostream>
#include <memory>
#include <thread>
#include <vector>


static const size_t COUNT = 5;


class Semaphore {
public:
	Semaphore(size_t _num = 1) : num(_num) {
	}

	void Acquire() {
		std::unique_lock<std::mutex> lock(m);
		if (!num) {
			c.wait(lock);
		}
		--num;
	}

	void Release() {
		std::unique_lock<std::mutex> lock(m);
		++num;
		c.notify_one();
	}

private:
	volatile size_t num;
	std::mutex m;
	std::condition_variable c;
};


typedef std::unique_ptr<std::mutex> Fork;


class Philosopher {
public:
	Philosopher(size_t _num, Semaphore &_waiter, std::vector<Fork> &_forks)
		: num(_num), waiter(_waiter), forks(_forks) {
	}

	virtual ~Philosopher() {
	}

	virtual void Think() = 0;
	virtual void Eat(const Fork &LeftFork, const Fork &RightFork) = 0;

protected:
	void IAmHungry() {
		waiter.Acquire();
		forks[num]->lock();
		forks[(num + 1) % forks.size()]->lock();
		Eat(forks[num], forks[(num + 1) % forks.size()]);
		forks[(num + 1) % forks.size()]->unlock();
		forks[num]->unlock();
		waiter.Release();
	}

protected:
	const size_t num;
	Semaphore &waiter;
	std::vector<Fork> &forks;
};


class MyPhilosopher: public Philosopher {
public:
	MyPhilosopher(size_t _num, Semaphore &_waiter, std::vector<Fork> &_forks)
		: Philosopher(_num, _waiter, _forks) {
	}

	virtual void Think() {
		for (size_t i = 0; i < 10; ++i) {
			IAmHungry();
		}
	}

	virtual void Eat(const Fork &LeftFork, const Fork &RightFork) {
		(void)LeftFork;
		(void)RightFork;
		std::cout << num << std::endl;
	}
};


size_t SetCount(int argc, char *argv[]) {
	size_t count = COUNT;
	if (1 > argc) {
		count = std::atoi(argv[1]);
	}
	if (2 > count) {
		std::cerr << "at least two philosophers may have a good meal" << std::endl;
		exit(1);
	}
	if (1000 < count) {
		std::cerr << "you must be kidding. the dining room isn't big enough to fit more than 1000 philosophers" << std::endl;
		exit(1);
	}
	return count;
}


int main(int argc, char *argv[]) {
	size_t count = SetCount(argc, argv);
	Semaphore waiter(count - 1);
	std::vector<Fork> forks;
	for (size_t i = 0; i < count; ++i) {
		forks.push_back(Fork(new std::mutex()));
	}
	std::vector<std::thread> threads;
	for (size_t i = 0; i < count; ++i) {
		MyPhilosopher philosopher(i, waiter, forks);
		threads.push_back(std::thread(&MyPhilosopher::Think, philosopher));
	}
	for (auto &thr : threads) {
		thr.join();
	}
	return 0;
}

думаю, и так всё понятно. есть желание — дискас.

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

ты старался. сколько времени потратил? честно?

С вами честно? Вы в своем уме?

Давайте так: вы говорите как вас зовут и где работаете, тогда можно будет о чем-то говорить.

думаю, и так всё понятно. есть желание — дискас.

В моем примере немного меняем процедуру запуска:

void
init( so_5::rt::environment_t & env,
	const std::size_t philosophers_count,
	const std::chrono::seconds test_duration )
{
	so_5::disp::thread_pool::params_t bind_params;
	bind_params.fifo( so_5::disp::thread_pool::fifo_t::individual );

	auto coop = env.create_coop( "dining_philosophers_with_arbiter",
			// All philosophers will be active objects.
			so_5::disp::thread_pool::create_disp_binder(
					"philosopher_disp", bind_params ) );
...
}

std::tuple< std::size_t, std::chrono::seconds >
process_command_line_args( int argc, char ** argv )
{
...
		if( philosophers < 2 || philosophers > 1000000 )
			throw std::invalid_argument(
					"philosophers count must be in [2..1000000]" );
...
}

int
main( int argc, char ** argv )
{
...
		so_5::launch(
				[params]( so_5::rt::environment_t & env )
				{
					init( env, std::get<0>(params), std::get<1>(params) );
				},
				[]( so_5::rt::environment_params_t & p ) {
					p.add_named_dispatcher( "philosopher_disp",
							so_5::disp::thread_pool::create_disp( 250 ) );
				} );
...
}

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

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

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

раз есть желание обсудить...

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

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

Давайте так: вы говорите как вас зовут и где работаете, тогда можно будет о чем-то говорить.

скан паспорта? вус?

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

сам при обсуждении условий спросил, должен ли каждый философ жить в отдельном потоке.

Потому и спросил, что есть возможность жить и в общих потоках.

в оп-посте написана ложь

Ануткать... Где опровержения?

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

Во-первых, вы уверены, что можете говорить за все задачи concurrency? Упомянутые вами проблемы обедающих философов, producer-consumer и пр. — это низкий уровень в concurrency. Что-то вроде блоков, посредством которых можно решать более высокоуровневые задачи.

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

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

скан паспорта?

Ну если хотите оставаться анонимным мудозвоном, то ради бога.

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

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

2. если бы ты занялся своим образованием вместо того чтобы велосипедить и флеймить на лор-е, то знал бы, что эти подходы эквиваленты и существуют вполне однозначные преобразования.

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

о преобразованиях...

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

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

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

Я вам на протяжении всего обсуждения говорил и еще раз скажу: SObjectizer не решает всех проблем и не подходит под все задачи. Но вот когда нужно сделать разделение ресурсов между сотнями тысяч параллельных активностей, приходится подниматься выше привычного вам мира семафоров/мутексов/event-loop-ов. И там тоже нужны свои инструменты.

2. если бы ты занялся своим образованием вместо того чтобы велосипедить и флеймить на лор-е, то знал бы, что эти подходы эквиваленты и существуют вполне однозначные преобразования.

Попробуйте ответить за свой уровень образования сначала. А то ведь вы и сути проблемы философов не понимаете, и саму проблему у вас Хоар придумал.

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

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

подниматься выше привычного вам мира

не приписывай мне свои галлюцинации.

саму проблему у вас Хоар придумал

т.е. обосрался, но продолжаешь делать вид, что это естественный цвет твоих штанов.

«вполне однозначные преобразования»

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

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

не приписывай мне свои галлюцинации.

Это ваши галлюцинации.

По прежнему будете придерживаться мнения, что Хоару принадлежит авторство проблемы обедающих философов?

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

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

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

Это ваши галлюцинации.

обоснуй

придерживаться мнения, что Хоару принадлежит

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

Смените у себя семафоры и мутексты на передачу сообщений.

зачем? решение рассматриваемой задачи сразу станет кривым

Заодно и проблему рабочего контекста решите.

до тебя не доходит, что это совсем другая задача и к сообщениям она не имеет никакого отношения?

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

обоснуй

Обосновать ваши галлюцинации? У меня нет такой травы.

это не мнение, а факт.

Этот факт мне пытается доказывать «анонимный вики-LOR-пидор» и я должен ему верить больше, чем ссылками на ранние работы Дейкстры?

Вы все еще хотите обоснования своих галлюцинаций?

зачем? решение рассматриваемой задачи сразу станет кривым
до тебя не доходит, что это совсем другая задача и к сообщениям она не имеет никакого отношения?

Вы хотели увидеть решение задачи обедающих философов на SO, вы его увидели. Это решение позволяет обслуживать философов, работающих как на общих контекстах, так и на своих собственных. При этом ожидание ресурсов не блокирует контекст. Что позволяет масштабироваться на большое количество философов.

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

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

Обосновать ваши галлюцинации?

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

ссылками на ранние работы Дейкстры

в студию. с философами. или см выше.

Вы хотели увидеть решение задачи обедающих философов на SO, вы его увидели.

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

но блокирует контекст

не употребляй термины, значения которых ты не понимаешь.

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

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

Читаем: «Но вот когда нужно сделать разделение ресурсов между сотнями тысяч параллельных активностей, приходится подниматься выше привычного вам мира семафоров/мутексов/event-loop-ов.»

Если у вас «привычный вам мир» однозначно транслируется в «пишу весь код», то это проблемы вашей травы.

в студию. с философами. или см выше.

http://www.cs.utexas.edu/users/misra/scannedPdf.dir/DrinkingPhil.pdf (1984 год, т.е. еще до того как появился CSP).

Цитата оттуда: This problem is a generalization of the classical dining philosophers problem [2, 3].

Под номерами 2 и 3 идут следующие ссылки:

2. DIJKSTRA, E.W. Two starvation free solutions to a general exclusion problem. EWD 625, Plataanstraat 5, 5671 AL Nuenen, The Netherlands.

3. DIJKSTRA, E.W. Hierarchical Ordering of Sequential Processes. In Operating Systems Techniques, C.A.R. Hoare and R.H. Perrott, Eds., Academic Press, New York, 1972.

увидел что оно громоздкое и неэффективное.

Неэффективность в чем измеряется?

по второму: два философа даже на противоположных концах стола не могут одновременно брать вилку. мало того, никто не может даже встать из-за стола.

Конкретный алгоритм инкапсулирован внутри арбитра. Его смена никак не скажется на философах. В отличии от.

не употребляй термины, значения которых ты не понимаешь.

Ну конечно, истинное понимание доступно только вам, анонимным LOR-пидорам.

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

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

ты не привёл формулировку задачи обедающих философов. жду.

Неэффективность в чем измеряется?

в процессе получения и освобождения вилки.

Его смена никак не скажется на философах. В отличии от.

покажи отличие. замена реализации метода vs замена реализации класса?

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

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

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

ты не привёл формулировку задачи обедающих философов.

Я тут достаточно информации из внешних, вполне себе проверяемых источников, привел.

Теперь ваша очередь хоть что-то показать.

в процессе получения и освобождения вилки.

Эффективность в чем измеряется? В процессах? В попугаях?

покажи отличие. замена реализации метода vs замена реализации класса?

Мне еще нужно и ваш код переписать. Передоз?

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

проблемы обедающих философов, producer-consumer и пр. — это низкий уровень в concurrency.

А что будет высоким? Мне в порядке самообразования.

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

> ты не привёл формулировку задачи обедающих философов.

Я тут достаточно информации из внешних, вполне себе проверяемых источников, привел.

Ну вот еще до кучи. Edsger W.Dijkstra, «Hierarchical Ordering of Sequential Processes», 1971 год. http://www.cs.utexas.edu/users/EWD/ewd03xx/EWD310.PDF

Стр.21:

----- We now turn to the problem of the Five Dining Philosophers. The life of a philosopher consists of an alternation of thinking and eating:

cycle begin think;
            eat
      end

Five philisophers, numbered from 0 through 4 are living in a house where the table laid for them, each philosopher having his own place at the table.

<здесь классическая картинка с круглым столом, тарелками и вилками>

Their only problem - besides those of philosophy - is that the dish served is a very difficult kind of spaghetti, that has to be eaten with two forks. There are two forks next to each plate, so that presents no difficulty: as a consequence, however, no two neighbours may be eating simultaneously. -----

В конце работы высказывается благодарность нескольким людям, в том числе и Хоару. Но ссылок на работы Хоара нет.Упоминания того, что Хоар автор этой проблемы, не видно.

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

вам никто ничего не должен

действительно, не должен... приписывать мне свои галлюцинации

Я тут достаточно информации

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

Эффективность в чем измеряется?

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

Мне еще нужно и ваш код переписать.

если у тебя дислексия, то да. или прекратить пустые пререкания.

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

Я вот тут некоторое время назад собрал ссылки на материалы, касающиеся разработке софта для AXD301 на Erlang-е: http://eao197.blogspot.com/2010/01/compprog-axd-301.html

Думаю, что если просмотреть некоторые презентации оттуда, то будет несколько понятнее, о чем речь. Например, Concurrency Oriented Programming in Erlang.

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

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

cycle begin think;
            eat
      end

ну ты понял...

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

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

Смотрим в историю. На мой вопрос, какой алгоритм вас устроит, вы ответили:

тот, который наиболее удобен для твоей «библиотеки»

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

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

бредней о том, что философы думают держа вилку в руках.

Легко проследить историю и увидеть, что вы нигде не дали точного описания задачи обедающих философов. Та формулировка из Хоара, которая нужна была именно вам, всплыла только после того, как я стал задавать уточняющие вопросы. Обоснованно полагая, что вы можете держать в голове что-то свое. Так оно и вышло. Есть несколько описаний этой задачи (у Дейкстры, у Хоара, в Wiki), вы как постановщик задачи должны были указать на нужное вам определение. За отсутствием такового я мог обращаться к любому. Вот, к такому, например:

  • think until the left fork is available; when it is, pick it up;
  • think until the right fork is available; when it is, pick it up;
  • when both forks are held, eat for a fixed amount of time;
  • then, put the right fork down;
  • then, put the left fork down;
  • repeat from the beginning.

Здесь нормальным английским языком сказано, что философ думает, держа в руке левую вилку.

или прекратить пустые пререкания.

Еще раз. Мой код без изменения чего-либо в арбитре и/или философе позволяет отмасштабироваться до миллионов философов на пуле потоков. Ваш код этого не сможет сделать в принципе. Можете это опровергнуть? Или привести решение, которое может масштабироваться до таких величин?

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

впервые сформулирована в 1965.

Ссылку на работу Хоара от 1965-го года в студию. Или хотя бы до 1971-го года.

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

Теперь начинаются поиски проблемы в алгоритме.

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

нигде не дали точного описания задачи обедающих философов

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

Здесь нормальным английским языком сказано

по-русски на заборе иногда и не такое пишут. я всем и всегда бесплатно советую: никогда не используйте википедию в качестве источника знаний.

Можете это опровергнуть?

я пытался?

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

я сомневаюсь, что он это когда-то публиковал. тем не менее, научный мир с его авторством согласен (в описанной мной выше формулировке: дейкстра — ленточные накопители, хоар — философы... т.е. ничего нового, что было бы достойно отдельной публикации).

естественно, что индивидумы, получающие знания из википедии, могут иметь своё более веское мнение.

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

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

Собственно, все намерения идут лесом после отказа уточнить конкретный алгоритм. Поскольку под граничные условия задачи выбираются разные алгоритмы. Алгоритм с арбитром не подходит под условиях «тяжелых» вилок (хотя, опять же, арбитр может лишь раздавать разрешение на поднятие вилки философом). Зато он позволяет реализовать «нечестное» распределение приборов. Например, если оказалось, что у пяти философов распределение вот такое: T,H,H,H,E (т.е. пятый ест, поэтому четвертый не может захватить свою правую вилку, не держит свою левую, аналогично с третьим и вторым, а первый просто не может сеть за стол в вашем решении), то арбитр может привести философов вот к такому варианту: T,E,H,H,E.

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

естественно, что индивидумы, получающие знания из википедии, могут иметь своё более веское мнение.

Ваше мнение, не подкрепленное вообще ничем, кроме факта описания этой задачи в CSP, конечно же, более веско.

Чтож, в одном его точно крайне сложно будет опровергнуть: Хоару является автором описания задачи обедающих философов в своей книге.

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

С учетом того, что людей, реально занимающихся Real-Time, очень и >>очень мало, то это общепринятое сокращение в очень узких кругах.

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

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

ReaTime это что-то совсем непонятное...

Мне вот интересно, название so_5::rt вместо so_5::runtime действительно является стоп-фактором чтобы попробовать агентов в C++?

И читать такой код:

struct msg_shutdown_signal : public so_5::runtime::signal_t {};
class my_agent : public so_5::runtime::agent_t {
  public:
    my_agent( so_5::runtime::environment_t & env ) { ... }
...
действительно намного проще, чем такой:
struct msg_shutdown_signal : public so_5::rt::signal_t {};
class my_agent : public so_5::rt::agent_t {
  public:
    my_agent( so_5::rt::environment_t & env ) { ... }
...

Почему расшифровка rt как runtime вместо rt как realtime вызывает столько разговоров.

PS. Да, что такое realtime я в курсе, имел опыт.

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

после отказа уточнить конкретный алгоритм

естественно. если мы рассматриваем сортировку, то пузырёк тоже сойдёт, если не был оговорен алгоритм. повторяю: ты — толстый тролль.

Алгоритм с арбитром не подходит под условиях «тяжелых» вилок

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

Зато он позволяет реализовать «нечестное» распределение

так. ищем в википедии ключевое слово «starvation», оно же «голодание» философа :) авторы (и дейкстра, и хоар) считали, что это что-то плохое.

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

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

> Зато он позволяет реализовать «нечестное» распределение

так. ищем в википедии ключевое слово «starvation», оно же «голодание» философа :) авторы (и дейкстра, и хоар) считали, что это что-то плохое.

Под нечестностью подразумевалось нарушение условия задачи. По условию философ берет левую вилку. Только после этого правую. Арбитр/официант может увидеть ситуации, когда философ держит левую вилку, но не может взять правую, которая сейчас занята. Левая вилка у такого философа «забирается» и отдается в качестве правой левому соседу. «Забирается» написано в кавычках поскольку левую вилку официант этому философу вообще не отдает.

ты — толстый тролль.

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

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