Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
What makes this possible is D's support for so called fibers (also often called co-routines). Fibers behave a lot like threads, just that they are are actually all running in the same thread. As soon as a running fiber calls a special yield() function, it returns control to the function that started the fiber. The fiber can then later be resumed at exactly the position and with the same state it had when it called yield(). This way fibers can be multiplexed together, running quasi-parallel and using each threads capacity as much as possible.
зачем намеренно ограничивать используемые типы? я, к примеру, вместо 'std::string' хочу использовать мой 'sometype', который, по сути, со 'std::string' не имеет ничего общего, кроме концепта. сейчас же, при использовании вашего кода, у меня не будет такой возможности. второе — зачем лямбды кастовать в 'std::function<void()>'? какой в этом смысл?По-моему, очевидно — чтобы не писать шаблоны. Для целей статьи этого более, чем достаточно. Более того, не существует «правильного» варианта написания интерфейса, всегда будут недовольные. Ну и, повторюсь, что для сути статьи это абсолютно безразлично.
думаете, пользователю asio, действительно не нужно знать про io_service, как будто это что-то ненужное? — это ядро asio. первое что должен знать пользователь asio, это именно io_service. более того, открою вам тайну — проактор реализуется именно io_service`ом.После обертки у нас растворились пользователи asio и появились пользователи Socket, Acceptor, go… И я тоже открою тайну: проактор — это теперь (в статье) реализация, а не интерфейс.
как вы собираетесь обрабатывать исключения, выбрасываемые из io_service::run()?Как-то так:
typedef std::function<void ()> Handler;
void go(Handler handler)
{
LOG("sync::go");
std::thread([handler] {
try
{
LOG("new thread had been created");
handler();
LOG("thread was ended successfully");
}
catch (std::exception& e)
{
LOG("thread was ended with error: " << e.what());
}
}).detach();
}
К счастью, есть boost.context, которая и реализует все, что необходимо для поддержки конкретной платформы. Написано все на ассемблере, в лучших традициях. Можно, конечно, использовать boost.coroutine, но зачем, когда есть boost.context? Больше ада и угара!Предполагаю, что автору был необходим ад и угар :)
предполагаю, автор не читал доку последних нескольких версий boost, а только к версии 1.50Вот именно это предположение ложно (т.е. предположение о том, что автор не читал доку).
В случае асинхронного вызова способ существует ровно один: передача ошибки через обработчик
$ g++ -std=c++11 *.cpp -o server
In file included from async.cpp:6:0:
sync.h:9:16: error: ‘namespace sync { }’ redeclared as different kind of symbol
In file included from /usr/include/boost/config/stdlib/libstdcpp3.hpp:77:0,
from /usr/include/boost/config.hpp:44,
from /usr/include/boost/asio/detail/config.hpp:26,
from /usr/include/boost/asio/async_result.hpp:18,
from /usr/include/boost/asio.hpp:20,
from async.h:5,
from async.cpp:5:
/usr/include/unistd.h:986:13: error: previous declaration of ‘void sync()’
async.cpp: In function ‘void async::dispatch(int)’:
async.cpp:31:9: error: ‘sync’ is not a class, namespace, or enumeration
Асинхронность: назад в будущее