SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
1
2 
карты 
Асинхронная 
разработка на C++ 
Дмитрий Жестилевский
3 
Содержание 
! Как работает загрузка карты 
! Стейт-машина и линейный код 
! С++11 concurrency 
! Наш вариант concurrency 
! Пример реализации загрузки карты
4
5 
Тайл 
! Можно отменять 
! Должен кешироваться 
! Должен обновляться 
! Один тайл может содержать множество версий
6 
Схема загрузки одного тайла 
Старт 
Есть 
в памяти? 
Сходить в диск 
Есть 
на диске? 
Сходить в сеть 
Обновился? 
Конец 
Вернуть 
тайл 
Декодировать 
и положить в память 
Вернуть 
тайл 
Вернуть 
тайл 
Декодировать 
и положить в память 
Нет 
Да 
Да 
Да 
Нет 
Нет
7 
Конечный автомат 
Он же стейт-машина
Row<NotInRam , RequestTile , LoadingFromDisk , none , none >,! 
Row<NotInRam , DiscardTile , none , none , none >,! 
Row<NotInRam , UpdateTile , none , none , none >,! 
// +-------------+--------------------------+-----------------+-------------------+-----------------------+! 
Row<LoadingFromDisk, RequestTile , none , none , none >,! 
// this transition will be performed if isTileUpToDate returns false! 
Row<LoadingFromDisk, TileReady , UpdatingFromNet , NotifyCaller , none >,! 
Row<LoadingFromDisk, TileReady , UpToDateInRam , NotifyCaller , IsTileUpToDate >,! 
Row<LoadingFromDisk, TileRequestError , LoadingFromNet , none , none >,! 
// +-------------+--------------------------+-----------------+-------------------+-----------------------+! 
Row<LoadingFromNet , RequestTile , none , none , none >,! 
Row<LoadingFromNet , TileReady , InRamSyncing , NotifyCaller , none >,! 
Row<LoadingFromNet , TileRequestError , NotInRam , NotifyCaller , none >,! 
// +-------------+--------------------------+-----------------+-------------------+-----------------------+! 
Row<UpdatingFromNet, RequestTile , none , NotifyCaller , none >,! 
Row<UpdatingFromNet, TileReady , InRamSyncing , NotifyCaller , none >,! 
Row<UpdatingFromNet, TileRequestError , OldInRam , none , none >,! 
// +-------------+--------------------------+-----------------+-------------------+-----------------------+! 
Row<InRamSyncing , RequestTile , none , NotifyCaller , none >,! 
Row<InRamSyncing , DiscardTile , none , none , none >,! 
Row<InRamSyncing , TileSyncingCompleted , UpToDateInRam , none , none >,! 
Row<InRamSyncing , TileSyncingError , UpToDateInRam , none , none >,! 
// +-------------+--------------------------+-----------------+-------------------+-----------------------+! 
// May be we don't need this state.! 
Row<OldInRam , RequestTile , UpdatingFromNet , NotifyCaller , none >,! 
Row<OldInRam , UpdateTile , UpdatingFromNet , none , none >,! 
Row<OldInRam , DiscardTile , none , none , none >,! 
// +-------------+--------------------------+-----------------+-------------------+-----------------------+! 
Row<UpToDateInRam , RequestTile , none , NotifyCaller , none >,! 
Row<UpToDateInRam , UpdateTile , none , none , none >,! 
Row<UpToDateInRam , UpdateTile , UpdatingFromNet , none , Not_<IsTileUpToDate> >,! 
Row<UpToDateInRam , DiscardTile , none , none , none >,! 
// +-------------+--------------------------+-----------------+-------------------+-----------------------+! 
Row<AllOk , DiscardTile , CancelledMode , none , none >,! 
Row<CancelledMode , RequestTile , AllOk , none , none >! 
8
9 
Линейный код 
void loadTile(int x, int y, output_iterator output) {! 
if (auto tile = inMemory(x, y)) {! 
output << tile;! 
}! 
! 
if (auto tile = readFromDisk(x, y)) {! 
output << decode(tile);! 
prevVersion = tile.version;! 
}! 
! 
while (true) {! 
Tile tile = readFromNet(x, y, prevVersion);! 
if (tile.version == prevVersion) continue;! 
prevVersion = tile.version;! 
output << decode(tile);! 
}! 
}! 
!
10 
C++11 concurrency
Promise<int> promise;! 
11 
Future/Promise 
Promise<int> p;! 
Future<int> f = p.future();! 
Future Promise 
auto future = startAsync();! 
// ...! 
// ...! 
int value = future.get();! 
int val = calc();! 
std::cout << value;!promise.set(val);!
12 
Использование Future 
output 
int meaningOfLife() {! 
sleep(100500);! 
return 42;! 
}! 
! 
int main() {! 
std::future<int> meaningOfLife = std::async([] { ! 
return meaningOfLife(); ! 
});! 
! 
std::future<int> calculation = std::async([] { return calcSmth(); });! 
! 
std::cout << meaningOfLife().get() + calculation.get() << std::endl;! 
}! 
{ 
calcSmth Meaning 
Of Life 
}
13 
std::async 
Пример реализации std::async в случае создания отдельного 
потока на каждую операцию 
Future<T> async(Function<T()> func) {! 
Promise<T> promise;! 
auto future = promise.future();! 
! 
std::thread([promise = std::move(promise), func] {! 
try {! 
promise.setValue(func());! 
} catch (...) {! 
promise.setException(std::current_exception());! 
}! 
}).detach();! 
! 
return future;! 
}!
14 
IO binding 
Использование асинхронной сети в синхронном коде 
void NetworkingAPI::httpGet(std::string url, ! 
std::function<void(Response, Error)>);! 
! 
Future<Response> httpGet(const std::string& url) {! 
Promise<Response> promise;! 
auto future = promise.future();! 
! 
NetworkingAPI::httpGet(url, ! 
[promise = std::move(promise)]! 
(Response response, Error error) {! 
if (error)! 
promise.setException(error);! 
else! 
promise.setValue(response);! 
});! 
}!
15 
Чего нет в std:: 
! Масштабируемость 
! Отменяемость асинхронных операций 
! Генераторы — функции, возвращающие множество 
результатов
16 
Контексты исполнения 
! Потоки 
! Процессы
17 
Coroutine – user-space thread 
Пишем асинхронный код синхронно
18 
Примитивы 
async::Future! 
async::Promise! 
async::Mutex! 
async::CV! 
Coroutines! 
Coro Scheduler! 
std::future! 
std::promise! 
std::mutex! 
std::cv! 
Threads! 
OS Scheduler! 
Future.get() не блокирует поток 
Реализованы 
~одинаково
19 
Модель потоков 
Все взаимодействие с IO – в отдельных выделенных потоках 
(сеть, диск) 
Все остальное – в глобальном thread pool
20 
Отмена операций 
! Отмена через exception (Future.reset, ~Future) 
! Cancellation points: wait, sleep, get 
! Мгновенная отмена или ленивая?
21 
Генераторы
22 
Поточная десериализация 
Генератор1: байты 
Генератор2: байты объекты 
MultiFuture<char> networkBytes();! 
! 
MultiFuture<Object> objects(MultiFuture<char> bytesStream) {! 
return async<Object>([](MultiPromise<Object>* output) {! 
Parser parser(std::move(bytesStream));! 
! 
while (!parser.finished()) {! 
output->yield(parser.next());! 
}! 
};! 
}! 
! 
void Parser::read(int size, char* data) {! 
while (size > 0) {! 
*data = bytes_.get();! 
data++; ! 
size--;! 
}! 
}! 
!
23 
Схема загрузки одного тайла 
Старт 
Есть 
в памяти? 
Сходить в диск 
Есть 
на диске? 
Сходить в сеть 
Обновился? 
Конец 
Вернуть 
тайл 
Декодировать 
и положить в память 
Вернуть 
тайл 
Вернуть 
тайл 
Декодировать 
и положить в память 
Нет 
Да 
Да 
Да 
Нет 
Нет
24 
Загрузка одного тайла 
NetTileProvider 
Один сырой тайл 
Запрос одной версии 
тайла из сети 
RawTileLoader 
Кеширование на диске 
Версионирование 
Поток версий сырых данных 
TileLoader 
Кеширование в памяти 
Декодирование 
Поток версий готовых тайлов
25 
RawTileLoader 
Задача – вернуть поток версий сырых данных 
MultiFuture<RawTile> rawTileVersions(int x, y) {! 
return async<RawTile>([=](MultiPromise<RawTile>* output) {! 
std::string currentVer, currentEtag;! 
RawTile rawTile;! 
! 
if (rawTile = readFromDisk(x, y)) {! 
currentVer = rawTile->version;! 
currentEtag = rawTile->etag;! 
output->yield(rawTile);! 
}! 
! 
for (const auto& ver : versions_.subscribe()) {! 
rawTile = loadFromNetwork(x, y, ver, currentEtag);! 
! 
writeToDisk(x, y, rawTile);! 
! 
currentVer = rawTile->version;! 
currentEtag = rawTile->etag;! 
output->yield(rawTile);! 
} ! 
}); // async! 
}!
26 
TileLoader 
Задача – вернуть поток версий одного тайла 
MultiFuture<Tile> tileVersions(int x, y) {! 
return async<Tile>([=](MultiPromise<Tile>* output) {! 
Tile tile = memCache->get(x, y);! 
if (tile) ! 
output->yield(tile);! 
! 
for (const auto& rawTile : rawTileVersions(x, y)) {! 
tile.version = rawTile->version;! 
if (tile.etag != rawTile->etag) {! 
tile.etag = rawTile->etag;! 
tile.data = decoder_(rawTile->rawData);! 
}! 
! 
output->yield(tile);! 
memCache_->set(x, y, tile);! 
}! 
}); // async! 
}!
27 
Линейный код из примера 
void loadTile(int x, int y, output_iterator output) {! 
if (auto tile = inMemory(x, y)) {! 
output << tile;! 
}! 
! 
if (auto tile = readFromDisk(x, y)) {! 
output << decode(tile);! 
prevVersion = tile.version;! 
}! 
! 
while (true) {! 
Tile tile = readFromNet(x, y, prevVersion);! 
if (tile.version == prevVersion) continue;! 
prevVersion = tile.version;! 
output << decode(tile);! 
}! 
}! 
!
28 
Мы пишем понятный и выразительный код 
И вам желаем того жеJ
29 
Спасибо за внимание!
30 
Дмитрий Жестилевский 
Яндекс.Карты 
Руководитель группы 
gordon@yandex-team.ru 
@dr_zhest

Contenu connexe

Tendances

Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Ontico
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...corehard_by
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияMichael Pankov
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsPlatonov Sergey
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексYandex
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Ontico
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package managercorehard_by
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Ontico
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Ontico
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииCEE-SEC(R)
 
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/LinuxDefconRussia
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 

Tendances (20)

Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
Модель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, ЯндексМодель памяти C++ - Андрей Янковский, Яндекс
Модель памяти C++ - Андрей Янковский, Яндекс
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package manager
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализации
 
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 

Similaire à Дмитрий Жестилевский — Yet another threading framework: асинхронная разработка на C++ под мобильные устройства

Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в JavaProvectus
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
1 встреча — Параллельное программирование (А. Свириденков)
1 встреча — Параллельное программирование (А. Свириденков)1 встреча — Параллельное программирование (А. Свириденков)
1 встреча — Параллельное программирование (А. Свириденков)Smolensk Computer Science Club
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Vadim Kosov
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Ontico
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаPositive Hack Days
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаAndrey Karpov
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 

Similaire à Дмитрий Жестилевский — Yet another threading framework: асинхронная разработка на C++ под мобильные устройства (20)

Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
1 встреча — Параллельное программирование (А. Свириденков)
1 встреча — Параллельное программирование (А. Свириденков)1 встреча — Параллельное программирование (А. Свириденков)
1 встреча — Параллельное программирование (А. Свириденков)
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
 
Cpp
CppCpp
Cpp
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)
 
20110227 csseminar alvor_breslav
20110227 csseminar alvor_breslav20110227 csseminar alvor_breslav
20110227 csseminar alvor_breslav
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 

Plus de Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

Plus de Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Дмитрий Жестилевский — Yet another threading framework: асинхронная разработка на C++ под мобильные устройства

  • 1. 1
  • 2. 2 карты Асинхронная разработка на C++ Дмитрий Жестилевский
  • 3. 3 Содержание ! Как работает загрузка карты ! Стейт-машина и линейный код ! С++11 concurrency ! Наш вариант concurrency ! Пример реализации загрузки карты
  • 4. 4
  • 5. 5 Тайл ! Можно отменять ! Должен кешироваться ! Должен обновляться ! Один тайл может содержать множество версий
  • 6. 6 Схема загрузки одного тайла Старт Есть в памяти? Сходить в диск Есть на диске? Сходить в сеть Обновился? Конец Вернуть тайл Декодировать и положить в память Вернуть тайл Вернуть тайл Декодировать и положить в память Нет Да Да Да Нет Нет
  • 7. 7 Конечный автомат Он же стейт-машина
  • 8. Row<NotInRam , RequestTile , LoadingFromDisk , none , none >,! Row<NotInRam , DiscardTile , none , none , none >,! Row<NotInRam , UpdateTile , none , none , none >,! // +-------------+--------------------------+-----------------+-------------------+-----------------------+! Row<LoadingFromDisk, RequestTile , none , none , none >,! // this transition will be performed if isTileUpToDate returns false! Row<LoadingFromDisk, TileReady , UpdatingFromNet , NotifyCaller , none >,! Row<LoadingFromDisk, TileReady , UpToDateInRam , NotifyCaller , IsTileUpToDate >,! Row<LoadingFromDisk, TileRequestError , LoadingFromNet , none , none >,! // +-------------+--------------------------+-----------------+-------------------+-----------------------+! Row<LoadingFromNet , RequestTile , none , none , none >,! Row<LoadingFromNet , TileReady , InRamSyncing , NotifyCaller , none >,! Row<LoadingFromNet , TileRequestError , NotInRam , NotifyCaller , none >,! // +-------------+--------------------------+-----------------+-------------------+-----------------------+! Row<UpdatingFromNet, RequestTile , none , NotifyCaller , none >,! Row<UpdatingFromNet, TileReady , InRamSyncing , NotifyCaller , none >,! Row<UpdatingFromNet, TileRequestError , OldInRam , none , none >,! // +-------------+--------------------------+-----------------+-------------------+-----------------------+! Row<InRamSyncing , RequestTile , none , NotifyCaller , none >,! Row<InRamSyncing , DiscardTile , none , none , none >,! Row<InRamSyncing , TileSyncingCompleted , UpToDateInRam , none , none >,! Row<InRamSyncing , TileSyncingError , UpToDateInRam , none , none >,! // +-------------+--------------------------+-----------------+-------------------+-----------------------+! // May be we don't need this state.! Row<OldInRam , RequestTile , UpdatingFromNet , NotifyCaller , none >,! Row<OldInRam , UpdateTile , UpdatingFromNet , none , none >,! Row<OldInRam , DiscardTile , none , none , none >,! // +-------------+--------------------------+-----------------+-------------------+-----------------------+! Row<UpToDateInRam , RequestTile , none , NotifyCaller , none >,! Row<UpToDateInRam , UpdateTile , none , none , none >,! Row<UpToDateInRam , UpdateTile , UpdatingFromNet , none , Not_<IsTileUpToDate> >,! Row<UpToDateInRam , DiscardTile , none , none , none >,! // +-------------+--------------------------+-----------------+-------------------+-----------------------+! Row<AllOk , DiscardTile , CancelledMode , none , none >,! Row<CancelledMode , RequestTile , AllOk , none , none >! 8
  • 9. 9 Линейный код void loadTile(int x, int y, output_iterator output) {! if (auto tile = inMemory(x, y)) {! output << tile;! }! ! if (auto tile = readFromDisk(x, y)) {! output << decode(tile);! prevVersion = tile.version;! }! ! while (true) {! Tile tile = readFromNet(x, y, prevVersion);! if (tile.version == prevVersion) continue;! prevVersion = tile.version;! output << decode(tile);! }! }! !
  • 11. Promise<int> promise;! 11 Future/Promise Promise<int> p;! Future<int> f = p.future();! Future Promise auto future = startAsync();! // ...! // ...! int value = future.get();! int val = calc();! std::cout << value;!promise.set(val);!
  • 12. 12 Использование Future output int meaningOfLife() {! sleep(100500);! return 42;! }! ! int main() {! std::future<int> meaningOfLife = std::async([] { ! return meaningOfLife(); ! });! ! std::future<int> calculation = std::async([] { return calcSmth(); });! ! std::cout << meaningOfLife().get() + calculation.get() << std::endl;! }! { calcSmth Meaning Of Life }
  • 13. 13 std::async Пример реализации std::async в случае создания отдельного потока на каждую операцию Future<T> async(Function<T()> func) {! Promise<T> promise;! auto future = promise.future();! ! std::thread([promise = std::move(promise), func] {! try {! promise.setValue(func());! } catch (...) {! promise.setException(std::current_exception());! }! }).detach();! ! return future;! }!
  • 14. 14 IO binding Использование асинхронной сети в синхронном коде void NetworkingAPI::httpGet(std::string url, ! std::function<void(Response, Error)>);! ! Future<Response> httpGet(const std::string& url) {! Promise<Response> promise;! auto future = promise.future();! ! NetworkingAPI::httpGet(url, ! [promise = std::move(promise)]! (Response response, Error error) {! if (error)! promise.setException(error);! else! promise.setValue(response);! });! }!
  • 15. 15 Чего нет в std:: ! Масштабируемость ! Отменяемость асинхронных операций ! Генераторы — функции, возвращающие множество результатов
  • 16. 16 Контексты исполнения ! Потоки ! Процессы
  • 17. 17 Coroutine – user-space thread Пишем асинхронный код синхронно
  • 18. 18 Примитивы async::Future! async::Promise! async::Mutex! async::CV! Coroutines! Coro Scheduler! std::future! std::promise! std::mutex! std::cv! Threads! OS Scheduler! Future.get() не блокирует поток Реализованы ~одинаково
  • 19. 19 Модель потоков Все взаимодействие с IO – в отдельных выделенных потоках (сеть, диск) Все остальное – в глобальном thread pool
  • 20. 20 Отмена операций ! Отмена через exception (Future.reset, ~Future) ! Cancellation points: wait, sleep, get ! Мгновенная отмена или ленивая?
  • 22. 22 Поточная десериализация Генератор1: байты Генератор2: байты объекты MultiFuture<char> networkBytes();! ! MultiFuture<Object> objects(MultiFuture<char> bytesStream) {! return async<Object>([](MultiPromise<Object>* output) {! Parser parser(std::move(bytesStream));! ! while (!parser.finished()) {! output->yield(parser.next());! }! };! }! ! void Parser::read(int size, char* data) {! while (size > 0) {! *data = bytes_.get();! data++; ! size--;! }! }! !
  • 23. 23 Схема загрузки одного тайла Старт Есть в памяти? Сходить в диск Есть на диске? Сходить в сеть Обновился? Конец Вернуть тайл Декодировать и положить в память Вернуть тайл Вернуть тайл Декодировать и положить в память Нет Да Да Да Нет Нет
  • 24. 24 Загрузка одного тайла NetTileProvider Один сырой тайл Запрос одной версии тайла из сети RawTileLoader Кеширование на диске Версионирование Поток версий сырых данных TileLoader Кеширование в памяти Декодирование Поток версий готовых тайлов
  • 25. 25 RawTileLoader Задача – вернуть поток версий сырых данных MultiFuture<RawTile> rawTileVersions(int x, y) {! return async<RawTile>([=](MultiPromise<RawTile>* output) {! std::string currentVer, currentEtag;! RawTile rawTile;! ! if (rawTile = readFromDisk(x, y)) {! currentVer = rawTile->version;! currentEtag = rawTile->etag;! output->yield(rawTile);! }! ! for (const auto& ver : versions_.subscribe()) {! rawTile = loadFromNetwork(x, y, ver, currentEtag);! ! writeToDisk(x, y, rawTile);! ! currentVer = rawTile->version;! currentEtag = rawTile->etag;! output->yield(rawTile);! } ! }); // async! }!
  • 26. 26 TileLoader Задача – вернуть поток версий одного тайла MultiFuture<Tile> tileVersions(int x, y) {! return async<Tile>([=](MultiPromise<Tile>* output) {! Tile tile = memCache->get(x, y);! if (tile) ! output->yield(tile);! ! for (const auto& rawTile : rawTileVersions(x, y)) {! tile.version = rawTile->version;! if (tile.etag != rawTile->etag) {! tile.etag = rawTile->etag;! tile.data = decoder_(rawTile->rawData);! }! ! output->yield(tile);! memCache_->set(x, y, tile);! }! }); // async! }!
  • 27. 27 Линейный код из примера void loadTile(int x, int y, output_iterator output) {! if (auto tile = inMemory(x, y)) {! output << tile;! }! ! if (auto tile = readFromDisk(x, y)) {! output << decode(tile);! prevVersion = tile.version;! }! ! while (true) {! Tile tile = readFromNet(x, y, prevVersion);! if (tile.version == prevVersion) continue;! prevVersion = tile.version;! output << decode(tile);! }! }! !
  • 28. 28 Мы пишем понятный и выразительный код И вам желаем того жеJ
  • 29. 29 Спасибо за внимание!
  • 30. 30 Дмитрий Жестилевский Яндекс.Карты Руководитель группы gordon@yandex-team.ru @dr_zhest