SlideShare a Scribd company logo
Модульность и управляемая многопоточность. 1/34
http://klika-tech.com/
Модульность и управляемая многопоточность. 1/34
http://klika-tech.com/
Модульность и управляемая
многопоточность.
Трудности, проблемы, решения. Пример реализации на С++.
Think of it this way: threads are like salt, not like pasta.
You like salt, I like salt, we all like salt. But we eat more pasta.
— Larry McVoy
A computer is a state machine.
Threads are for people who can't program state machines.
— Alan Cox
Конференция C++ CoreHard Spring 2017, Минск
Василий Вяжевич
Модульность и управляемая многопоточность. 2/34
http://klika-tech.com/
Предисловие
Модульность и управляемая многопоточность. 3/34
http://klika-tech.com/
О чем поговорим?
Пример из жизни
Функция std::async
Последствия
Есть ли выход?
Подходы
Как это уже давно работает?
Строим архитектуру
Выводы
Вопросы
Модульность и управляемая многопоточность. 4/34
http://klika-tech.com/
Пример - АСУ гаражные ворота
Открыть/закрыть ворота
Световая сигнализация
Модульность и управляемая многопоточность. 5/34
http://klika-tech.com/
Как будем “моргать”?
bool isDoorMoving = false;
unsigned blinkLampInterval_ms = 500;
std::future<void> blinkFuture;
void openTheDoor()
{
startDoorMotorFwd();
isDoorMoving = true;
blinkFuture = std::async(std::launch::async, blinkLamp);
}
void blinkLamp()
{
do
{
bool lampIsOn = getLampStatus();
triggerLamp(!lampIsOn);
std::this_thread::sleep_for(std::chrono::milliseconds(blinkLampInterval_ms));
} while (isDoorMoving || lampIsOn);
}
Модульность и управляемая многопоточность. 6/34
http://klika-tech.com/
Заглянем в будущее.
Сколько потоков потребуется?
Сколько мьютексов и семафоров?
А вообще возможна отладка?
Модульность и управляемая многопоточность. 7/34
http://klika-tech.com/
С чем мы можем столкнуться?
Как производить отладку “по шагам” (debug)?
Стек вызовов отсутствует
Как отлаживать работу примитивов синхронизации?
Как осуществлять модульное тестирование (unit testing)?
Магические wait() и sleep().
Как часто необходимо распараллеливание?
Модульность и управляемая многопоточность. 8/34
http://klika-tech.com/
Сложность отладки многопоточных
приложений
2 потока - вполне возможно
3 потока - не просто
4 и более потока - практически невозможно!
Модульность и управляемая многопоточность. 9/34
http://klika-tech.com/
Когда возникает желание
использовать потоки?
Исключение блокировки процесса при ожидании.
Отзывчивость графического интерфейса.
Сетевой обмен.
Ввод/вывод (файлы, устройства).
Скорость и удобство разработки, лямбда выражения.
Параллельные процессы или событыя, паузы и ожидание?
auto callback=[](SomeType res) {
m_someWorkResult = res;
};
std::thread myThread = std::thread([](int a, int b) { //lambda
SomeType res = doSomeWork(a,b);
callback(res);
}, 5, 6); //parameters
Модульность и управляемая многопоточность. 10/34
http://klika-tech.com/
Как это уже давно работает?
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int
nCmdShow) {
...
while (GetMessage(&msg, NULL, , )) {
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage();
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Модульность и управляемая многопоточность. 11/34
http://klika-tech.com/
Алгоритм на основе событий
bool isDoorMoving = false;
unsigned blinkLampInterval_ms = 500;
void openTheDoor()
{
startDoorMotorFwd();
isDoorMoving = true;
blinkLamp();
}
void blinkLamp()
{
bool lampIsOn = getLampStatus();
triggerLamp(!lampIsOn);
if (isDoorMoving || lampIsOn) // instead of sleep()
addEventToMessageLoop(&blinkLamp, blinkLampInterval_ms);
}
Модульность и управляемая многопоточность. 12/34
http://klika-tech.com/
Строим архитектуру - требования
Логика не зависит от потоков
Возможность тестирования отдельных модулей
Возможность распараллеливания
Стек вызовов
Модульность и управляемая многопоточность. 13/34
http://klika-tech.com/
Определяем сущности
Модели (Машины состояний и алгоритмы)
Порты (Коммуникационные каналы)
Планировщик задач
Поток
Модульность и управляемая многопоточность. 14/34
http://klika-tech.com/
Взаимодействие моделей
Модульность и управляемая многопоточность. 15/34
http://klika-tech.com/
Планирование задач
Модульность и управляемая многопоточность. 16/34
http://klika-tech.com/
Планирование задач и взаимодействие
Модульность и управляемая многопоточность. 17/34
http://klika-tech.com/
Пинг-понг
Модульность и управляемая многопоточность. 18/34
http://klika-tech.com/
Модель игры с одним планировщиком
Модульность и управляемая многопоточность. 19/34
http://klika-tech.com/
Пинг-понг с одним планировщиком
Модульность и управляемая многопоточность. 20/34
http://klika-tech.com/
Модель игры с двумя планировщиками
Модульность и управляемая многопоточность. 21/34
http://klika-tech.com/
Пинг-понг с двумя планировщиками
Модульность и управляемая многопоточность. 22/34
http://klika-tech.com/
Модель игры с двумя планировщиками
и потоками
Модульность и управляемая многопоточность. 23/34
http://klika-tech.com/
Пинг-понг с двумя потоками
Модульность и управляемая многопоточность. 24/34
http://klika-tech.com/
Исходный код - игрок (PingPonger)
struct PingPonger : sms::BidirPort<Ball, Ball>
{
void process(const Ball& msg) override
{
challengeTask();
if (_count++<_maxCount)
send(msg);
else
_finished = true;
}
uint32_t _maxCount = 1000000;
uint32_t _count = 0;
bool _finished = false;
};
Модульность и управляемая многопоточность. 25/34
http://klika-tech.com/
Исходный код - создание объектов
//Общий планировщик
sms::QueuedScheduler scheduler;
PingPonger pingPonger1(scheduler);
PingPonger pingPonger2(scheduler);
//Каждому по планировщику
sms::QueuedScheduler scheduler1;
sms::QueuedScheduler scheduler2;
PingPonger pingPonger1(scheduler1);
PingPonger pingPonger2(scheduler2);
//Каждому по потоку
sms::Thread thread1;
sms::Thread thread2;
sms::QueuedScheduler scheduler1(thread1);
sms::QueuedScheduler scheduler2(thread2);
PingPonger pingPonger1(scheduler1);
PingPonger pingPonger2(scheduler2);
Модульность и управляемая многопоточность. 26/34
http://klika-tech.com/
Исходный код - заброс шарика
//Общий планировщик
pingPonger1.process(Ball());
//Каждому по планировщику
pingPonger1.process(Ball());
//Каждому по потоку
thread1.start();
thread2.start();
pingPonger1.process(Ball());
//pingPonger1.process(Ball());
while (!pingPonger1._finished)
std::this_thread::sleep_for(std::chrono::milliseconds(10));
thread1.terminate();
thread2.terminate();
Модульность и управляемая многопоточность. 27/34
http://klika-tech.com/
Результаты тестов - Linux
Linux kernel 4.4, Intel Core i7 2.4GHz, GCC
Один
планировщик
Два
планировщика
Два
потока
Один мяч, мкс 0.53 0.54 2,19+
Два мяча, мкс 0.52 0.56 0.85
Один мяч и
вычисления, мкс
4.4 4,4 6,8+
Два мяча и
вычисления, мкс
4.4 4.4 3.3
Модульность и управляемая многопоточность. 28/34
http://klika-tech.com/
Результаты тестов - Windows
Intel Core 2 Duo CPU 3GHz, Windows 8.1 x64, Visual C++
Один
планировщик
Два
планировщика
Два
потока
Один мяч, мкс 1.1 1.2 20.0…40.0
Два мяча, мкс 1.3 1.2 4.0…20.0
Один мяч и
вычисления,
мкс
5.8 5.9 15.0…25.0
Два мяча и
вычисления,
мкс
5.7 5.9 5.9…10
Модульность и управляемая многопоточность. 29/34
http://klika-tech.com/
Результаты тестов - Linux (ARM)
Linux Kernel 2.6, ARM926, GCC
Один
планировщик
Два
планировщика
Два
потока
Один мяч 26 мкс 28 мкс 18 мс
Два мяча 27 мкс 28 мкс 11 мс
Один мяч и
вычисления,
мкс
353 мкс 353 мкс 28 мс
Два мяча и
вычисления,
мкс
354 мкс 355 мкс 12,5 мс
Модульность и управляемая многопоточность. 30/34
http://klika-tech.com/
Результаты тестов
При использовании 2 потоков обработки сообщений результат
не стабилен
Потоки становятся стабильными, если время вычисления
превышает 10…100 мкс.
Windows и компилятор Visual C++ хуже справляются с
задачей, чем Linux и GCC
Модульность и управляемая многопоточность. 31/34
http://klika-tech.com/
Подведем итог
Использование потоков ускоряет разработку небольших
приложений на начальном этапе
Активное использование потоков затрудняет отладку и
тестирование
Потоки позволяют ускорить работу “длинных” задач за счет
распараллеливания (>0,1..1 мс)
Для коротких задач цикл выполнения задач лучше, чем
std::thread
Существующие решения
Модель акторов - SObjectizer, C++ Actor Framework (CAF)
Qt - QEventLoop, QTimer, QSocketNotifier
Модульность и управляемая многопоточность. 32/34
http://klika-tech.com/
Что не вошло в демо?
Асинхронные задачи AsyncTask и планировщик AsyncScheduler
Синхронный порт SyncPort и удаленные вызовы RPC
Сериализатор JSON
Мост и маршрутизатор
Модульное тестирование
Модульность и управляемая многопоточность. 33/34
http://klika-tech.com/
Что еще предстоит?
Сериализация (рефлексия) (JSON, ProtoBuf и т. п.)
Передача данных (TCP/UDP, Shared Memory)
Модульность и управляемая многопоточность. 34/34
http://klika-tech.com/
Вопросы?
Тема: Модульность и управляемая многопоточность.
Трудности, проблемы, решения. Пример реализации на С++.
Исходный код: https://github.com/vasviazh/sms
Докладчик: Василий Вяжевич
Компания: Klika Tech
email/skype: vviazhevich@klika-tech.com
email/skype: vasviazh@gmail.com / vas_viazh

More Related Content

What's hot

Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Sergey Platonov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Yauheni Akhotnikau
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
Alexey Paznikov
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
Aleksey Fomkin
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
Sergey Platonov
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
Badoo Development
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
Aleksander Alekseev
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Yandex
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
Roman Dvornov
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Ontico
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Ontico
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Sergey Platonov
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Ontico
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
Alexey Paznikov
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
Ontico
 
Mysql vs postgresql
Mysql vs postgresqlMysql vs postgresql
Mysql vs postgresql
Daniel Podolsky
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
Alexey Paznikov
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
Andrei Pangin
 

What's hot (20)

Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Mysql vs postgresql
Mysql vs postgresqlMysql vs postgresql
Mysql vs postgresql
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 

Similar to Модульность и управляемая многопоточность встраиваемых С++ приложений - трудности, проблемы, решения

CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)Dmitry Evteev
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх Webdriver
SQALab
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
Anastasia Goryacheva
 
МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)
Ontico
 
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOMYuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
OdessaJS Conf
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Simd
SimdSimd
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Yandex
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Ontico
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется всеОмские ИТ-субботники
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
Alex Tumanoff
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Mikhail Kurnosov
 
Андрей Ситник
Андрей СитникАндрей Ситник
Андрей Ситник
CodeFest
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
Yandex
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1
Illya Klymov
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Yandex
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Yandex
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...rit2011
 

Similar to Модульность и управляемая многопоточность встраиваемых С++ приложений - трудности, проблемы, решения (20)

CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх Webdriver
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)МРТ для данных / Анастасия Горячева (Avito)
МРТ для данных / Анастасия Горячева (Avito)
 
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOMYuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Simd
SimdSimd
Simd
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
 
Андрей Ситник
Андрей СитникАндрей Ситник
Андрей Ситник
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

Модульность и управляемая многопоточность встраиваемых С++ приложений - трудности, проблемы, решения

  • 1. Модульность и управляемая многопоточность. 1/34 http://klika-tech.com/ Модульность и управляемая многопоточность. 1/34 http://klika-tech.com/ Модульность и управляемая многопоточность. Трудности, проблемы, решения. Пример реализации на С++. Think of it this way: threads are like salt, not like pasta. You like salt, I like salt, we all like salt. But we eat more pasta. — Larry McVoy A computer is a state machine. Threads are for people who can't program state machines. — Alan Cox Конференция C++ CoreHard Spring 2017, Минск Василий Вяжевич
  • 2. Модульность и управляемая многопоточность. 2/34 http://klika-tech.com/ Предисловие
  • 3. Модульность и управляемая многопоточность. 3/34 http://klika-tech.com/ О чем поговорим? Пример из жизни Функция std::async Последствия Есть ли выход? Подходы Как это уже давно работает? Строим архитектуру Выводы Вопросы
  • 4. Модульность и управляемая многопоточность. 4/34 http://klika-tech.com/ Пример - АСУ гаражные ворота Открыть/закрыть ворота Световая сигнализация
  • 5. Модульность и управляемая многопоточность. 5/34 http://klika-tech.com/ Как будем “моргать”? bool isDoorMoving = false; unsigned blinkLampInterval_ms = 500; std::future<void> blinkFuture; void openTheDoor() { startDoorMotorFwd(); isDoorMoving = true; blinkFuture = std::async(std::launch::async, blinkLamp); } void blinkLamp() { do { bool lampIsOn = getLampStatus(); triggerLamp(!lampIsOn); std::this_thread::sleep_for(std::chrono::milliseconds(blinkLampInterval_ms)); } while (isDoorMoving || lampIsOn); }
  • 6. Модульность и управляемая многопоточность. 6/34 http://klika-tech.com/ Заглянем в будущее. Сколько потоков потребуется? Сколько мьютексов и семафоров? А вообще возможна отладка?
  • 7. Модульность и управляемая многопоточность. 7/34 http://klika-tech.com/ С чем мы можем столкнуться? Как производить отладку “по шагам” (debug)? Стек вызовов отсутствует Как отлаживать работу примитивов синхронизации? Как осуществлять модульное тестирование (unit testing)? Магические wait() и sleep(). Как часто необходимо распараллеливание?
  • 8. Модульность и управляемая многопоточность. 8/34 http://klika-tech.com/ Сложность отладки многопоточных приложений 2 потока - вполне возможно 3 потока - не просто 4 и более потока - практически невозможно!
  • 9. Модульность и управляемая многопоточность. 9/34 http://klika-tech.com/ Когда возникает желание использовать потоки? Исключение блокировки процесса при ожидании. Отзывчивость графического интерфейса. Сетевой обмен. Ввод/вывод (файлы, устройства). Скорость и удобство разработки, лямбда выражения. Параллельные процессы или событыя, паузы и ожидание? auto callback=[](SomeType res) { m_someWorkResult = res; }; std::thread myThread = std::thread([](int a, int b) { //lambda SomeType res = doSomeWork(a,b); callback(res); }, 5, 6); //parameters
  • 10. Модульность и управляемая многопоточность. 10/34 http://klika-tech.com/ Как это уже давно работает? int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { ... while (GetMessage(&msg, NULL, , )) { DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); }
  • 11. Модульность и управляемая многопоточность. 11/34 http://klika-tech.com/ Алгоритм на основе событий bool isDoorMoving = false; unsigned blinkLampInterval_ms = 500; void openTheDoor() { startDoorMotorFwd(); isDoorMoving = true; blinkLamp(); } void blinkLamp() { bool lampIsOn = getLampStatus(); triggerLamp(!lampIsOn); if (isDoorMoving || lampIsOn) // instead of sleep() addEventToMessageLoop(&blinkLamp, blinkLampInterval_ms); }
  • 12. Модульность и управляемая многопоточность. 12/34 http://klika-tech.com/ Строим архитектуру - требования Логика не зависит от потоков Возможность тестирования отдельных модулей Возможность распараллеливания Стек вызовов
  • 13. Модульность и управляемая многопоточность. 13/34 http://klika-tech.com/ Определяем сущности Модели (Машины состояний и алгоритмы) Порты (Коммуникационные каналы) Планировщик задач Поток
  • 14. Модульность и управляемая многопоточность. 14/34 http://klika-tech.com/ Взаимодействие моделей
  • 15. Модульность и управляемая многопоточность. 15/34 http://klika-tech.com/ Планирование задач
  • 16. Модульность и управляемая многопоточность. 16/34 http://klika-tech.com/ Планирование задач и взаимодействие
  • 17. Модульность и управляемая многопоточность. 17/34 http://klika-tech.com/ Пинг-понг
  • 18. Модульность и управляемая многопоточность. 18/34 http://klika-tech.com/ Модель игры с одним планировщиком
  • 19. Модульность и управляемая многопоточность. 19/34 http://klika-tech.com/ Пинг-понг с одним планировщиком
  • 20. Модульность и управляемая многопоточность. 20/34 http://klika-tech.com/ Модель игры с двумя планировщиками
  • 21. Модульность и управляемая многопоточность. 21/34 http://klika-tech.com/ Пинг-понг с двумя планировщиками
  • 22. Модульность и управляемая многопоточность. 22/34 http://klika-tech.com/ Модель игры с двумя планировщиками и потоками
  • 23. Модульность и управляемая многопоточность. 23/34 http://klika-tech.com/ Пинг-понг с двумя потоками
  • 24. Модульность и управляемая многопоточность. 24/34 http://klika-tech.com/ Исходный код - игрок (PingPonger) struct PingPonger : sms::BidirPort<Ball, Ball> { void process(const Ball& msg) override { challengeTask(); if (_count++<_maxCount) send(msg); else _finished = true; } uint32_t _maxCount = 1000000; uint32_t _count = 0; bool _finished = false; };
  • 25. Модульность и управляемая многопоточность. 25/34 http://klika-tech.com/ Исходный код - создание объектов //Общий планировщик sms::QueuedScheduler scheduler; PingPonger pingPonger1(scheduler); PingPonger pingPonger2(scheduler); //Каждому по планировщику sms::QueuedScheduler scheduler1; sms::QueuedScheduler scheduler2; PingPonger pingPonger1(scheduler1); PingPonger pingPonger2(scheduler2); //Каждому по потоку sms::Thread thread1; sms::Thread thread2; sms::QueuedScheduler scheduler1(thread1); sms::QueuedScheduler scheduler2(thread2); PingPonger pingPonger1(scheduler1); PingPonger pingPonger2(scheduler2);
  • 26. Модульность и управляемая многопоточность. 26/34 http://klika-tech.com/ Исходный код - заброс шарика //Общий планировщик pingPonger1.process(Ball()); //Каждому по планировщику pingPonger1.process(Ball()); //Каждому по потоку thread1.start(); thread2.start(); pingPonger1.process(Ball()); //pingPonger1.process(Ball()); while (!pingPonger1._finished) std::this_thread::sleep_for(std::chrono::milliseconds(10)); thread1.terminate(); thread2.terminate();
  • 27. Модульность и управляемая многопоточность. 27/34 http://klika-tech.com/ Результаты тестов - Linux Linux kernel 4.4, Intel Core i7 2.4GHz, GCC Один планировщик Два планировщика Два потока Один мяч, мкс 0.53 0.54 2,19+ Два мяча, мкс 0.52 0.56 0.85 Один мяч и вычисления, мкс 4.4 4,4 6,8+ Два мяча и вычисления, мкс 4.4 4.4 3.3
  • 28. Модульность и управляемая многопоточность. 28/34 http://klika-tech.com/ Результаты тестов - Windows Intel Core 2 Duo CPU 3GHz, Windows 8.1 x64, Visual C++ Один планировщик Два планировщика Два потока Один мяч, мкс 1.1 1.2 20.0…40.0 Два мяча, мкс 1.3 1.2 4.0…20.0 Один мяч и вычисления, мкс 5.8 5.9 15.0…25.0 Два мяча и вычисления, мкс 5.7 5.9 5.9…10
  • 29. Модульность и управляемая многопоточность. 29/34 http://klika-tech.com/ Результаты тестов - Linux (ARM) Linux Kernel 2.6, ARM926, GCC Один планировщик Два планировщика Два потока Один мяч 26 мкс 28 мкс 18 мс Два мяча 27 мкс 28 мкс 11 мс Один мяч и вычисления, мкс 353 мкс 353 мкс 28 мс Два мяча и вычисления, мкс 354 мкс 355 мкс 12,5 мс
  • 30. Модульность и управляемая многопоточность. 30/34 http://klika-tech.com/ Результаты тестов При использовании 2 потоков обработки сообщений результат не стабилен Потоки становятся стабильными, если время вычисления превышает 10…100 мкс. Windows и компилятор Visual C++ хуже справляются с задачей, чем Linux и GCC
  • 31. Модульность и управляемая многопоточность. 31/34 http://klika-tech.com/ Подведем итог Использование потоков ускоряет разработку небольших приложений на начальном этапе Активное использование потоков затрудняет отладку и тестирование Потоки позволяют ускорить работу “длинных” задач за счет распараллеливания (>0,1..1 мс) Для коротких задач цикл выполнения задач лучше, чем std::thread Существующие решения Модель акторов - SObjectizer, C++ Actor Framework (CAF) Qt - QEventLoop, QTimer, QSocketNotifier
  • 32. Модульность и управляемая многопоточность. 32/34 http://klika-tech.com/ Что не вошло в демо? Асинхронные задачи AsyncTask и планировщик AsyncScheduler Синхронный порт SyncPort и удаленные вызовы RPC Сериализатор JSON Мост и маршрутизатор Модульное тестирование
  • 33. Модульность и управляемая многопоточность. 33/34 http://klika-tech.com/ Что еще предстоит? Сериализация (рефлексия) (JSON, ProtoBuf и т. п.) Передача данных (TCP/UDP, Shared Memory)
  • 34. Модульность и управляемая многопоточность. 34/34 http://klika-tech.com/ Вопросы? Тема: Модульность и управляемая многопоточность. Трудности, проблемы, решения. Пример реализации на С++. Исходный код: https://github.com/vasviazh/sms Докладчик: Василий Вяжевич Компания: Klika Tech email/skype: vviazhevich@klika-tech.com email/skype: vasviazh@gmail.com / vas_viazh