SlideShare una empresa de Scribd logo
1 de 27
Concurrency
Типові приклади використання
Responsiveness
  Багатозадачність ОС
  Виконання операцій поза UI (I/O)
Performance
  Обробка даних паралельно (CPU)
  Виконання кількох задач паралельно
  (CPU-CPU, CPU-I/O, I/O-I/O)
Process
Процес визначає virtual address space
Досягається ізоляція, оскільки
- процеси не можуть напряму адресувати
   пам’ять інших процесів
Також можливе спільне використання:
- спільна бібліотека може входити до
адресного простору кількох процесів
Процес не виконує код,
а лише надає ресурси і контекст для
        виконання потоків
Потоки (threads) виконують код

Потоки виконуються в межах процесу
Мають доступ до всього адресного простору
процесу.
Кожен потік має свій стек викликів (локальні
змінні), вказівник поточної інструкції та
значення регістрів CPU
Виконання потоків у Windows
- Багатозадачна ОС
- Витісняюче планування на основі пріоритетів
  - (preemptive scheduling, priority-based)
- CPU завжди виконує той потік, який має
  найвищий пріоритет (і який готовий до
  виконання)
Планування (scheduling) Windows
- Потік виконується протягом фіксованого інтервалу
  часу (time slice)
- По закінченню інтервалу ОС перевіряє, чи є
  готовий потік з таким же пріоритетом
- Якщо є, потік витісняється
- Як тільки з’являється потік з вищим
  пріоритетом, потік витісняється
  - Навіть якщо його інтервал не закінчився
Переключення контексту
(context switching)
Вибравши новий потік для виконання, ОС
переключає контекст:
Зберігається стан регістрів CPU + IP
попереднього потоку
Відновлюються регістри CPU нового потоку
Потік звільняє CPU, коли:
- Завершився time slice
- Переходить в стан очікування самостійно
  - Диск, мережа, пам’ять (!), синхронізація
- Витісняється потоком з вищим пріоритетом
  - Який закінчив щось очікувати (диск, мережа,...)
  - Пріоритет якого збільшився
- Потік завершується
- …
Windows та Linux планують потоки,
не процеси

Наслідок:
  Процес А має 1 потік
  Процес Б має 9 потоків
  Процес Б отримає 90% процесорного часу
  (за умови однакового пріоритету потоків)
UI message loop
- Один GUI потік обробляє повідомлення з черги:
  - Clicks, repaints, mouse moves, key presses, …
- Події обробляються послідовно
- Отже, якщо одна подія займає довгий час, решта
  будуть чекати
- Отже, довготривалі події ніколи не повинні
  виконуватись в UI потоці
  - I/O, важкі обчислення (див. наст. слайд)
Довготривалі події ніколи
не повинні виконуватись в UI потоці
- UI потік не повинен блокуватись чекаючи
  завершення цих операцій
   - В т.ч. коли ці операції виконуються іншим потоком
- Для повернення результатів – signals and slots
   - “Qt developers are used to working with this kind of
     asynchronous behavior”
     http://qt-project.org/doc/qt-5.0/qtcore/thread-basics.html
Thread pool
- Створювати і видаляти потоки дорого
- Пул потоків виконує завдання
  використовуючи створений наперед набір
  потоків
- Залежно від навантаження пул створює
  додаткові потоки або видаляє непотрібні
Типові задачі
- Поділити дані на частини і обробляти
  паралельно
- Виконувати декілька незалежних задач
  паралельно
- Виконати довготривалу операцію поза UI
Паралелізм даних

                               ...
                         ...


   Thread 1   Thread 2
Паралельні незалежні задачі
              Task 1



                      Task 2



             Task 3




Seq                            Seq
Паралельні незалежні задачі

           Future




Seq                 Seq   Seq
Паралельні незалежні задачі

                                Future

                       Future


              Future


Seq     Seq               Seq    Seq     Seq
Операції поза UI

            DB Call




Seq                      Seq



         Event loop
Використання спільних даних
auto count = 0;
                         100
{



        {                      int temp = count;
              count++;         temp = temp + 1;
        });                    count = temp;
}
Використання спільних даних
count = 0

Потік A                    Потік B

int temp = count; // 0
                           int temp = count; // 0
temp = temp + 1; // 1
                           temp = temp + 1; // 1
count = temp; // 1
                           count = temp; // 1

count = 1 // WRONG! Should be 2
Доступ до спільних даних повинен
бути синхронізованим
auto count = 0;
std::mutex mutex;
                                             mutex.lock();
{                                            // ...
                                             mutex.unlock();


       {
             std::lock_guard<std::mutex> lock(mutex);
             count++;
       });
                                         Qt has its own bicycle
}
                                                 for this
Використання спільних даних
count = 0
Потік A                  Потік B
mutex.lock();
int temp = count; // 0
                         mutex.lock();
temp = temp + 1; // 1
count = temp; // 1
mutex.unlock();
                         int temp = count; // 0
                         temp = temp + 1; // 1
                         count = temp; // 1
                         mutex.unlock();
Синхронізацією керувати складно
Багато нюансів, про які ми навіть не
здогадуємось (як з count++)
Second order ignorance http://c2.com/cgi/wiki?OrdersOfIgnorance

Використовуйте готові засоби: алгоритми,
конкурентні колекції, tasks, futures,
QtConcurrent, QThreadPool, signals and slots
Advanced Qt

•   Thread-safety and reentrance
•   Working with threads
•   Basic synchronization techniques
•   High-level concurrency API
Working with threads

•   QThread - a wrapper around OS thread
•   do not subclass QThread
•   push processing objects to QThread instance
•   do not allocate heap memory in processing
    object constructor
•   be sure that thread is shut down when
    deleting QThread
•   be careful while connecting signals/slots in
    multithreading applications
Basic synchronization techniques


•   QMutex and QMutexLocker
•   QReadWriteLock

Más contenido relacionado

La actualidad más candente

.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basicseleksdev
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)Exoft LLC
 
System programing module 2
System programing module 2System programing module 2
System programing module 2Andrii Hladkyi
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)Anatoliy Okhotnikov
 
01 c# basics
01 c# basics01 c# basics
01 c# basicseleksdev
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7Nikita Pavliuchenko
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Nikita Pavliuchenko
 
IT Talks The c++'s simplest smart pointers in depth
IT Talks The c++'s simplest smart pointers in depthIT Talks The c++'s simplest smart pointers in depth
IT Talks The c++'s simplest smart pointers in depthVadym Muliavka
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3eleksdev
 
Version control
Version controlVersion control
Version controleleksdev
 

La actualidad más candente (15)

JavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basisJavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basis
 
.NET Platform. C# Basics
.NET Platform. C# Basics.NET Platform. C# Basics
.NET Platform. C# Basics
 
Design patterns part 1
Design patterns part 1Design patterns part 1
Design patterns part 1
 
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
 
System programing module 2
System programing module 2System programing module 2
System programing module 2
 
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
 
01 c# basics
01 c# basics01 c# basics
01 c# basics
 
Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 7
 
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
Prometheus. Масовий онлайн курс "Основи програмування". Лекція 5
 
IT Talks The c++'s simplest smart pointers in depth
IT Talks The c++'s simplest smart pointers in depthIT Talks The c++'s simplest smart pointers in depth
IT Talks The c++'s simplest smart pointers in depth
 
Advanced c sharp part 3
Advanced c sharp part 3Advanced c sharp part 3
Advanced c sharp part 3
 
Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5
 
Version control
Version controlVersion control
Version control
 
07 Containers
07 Containers07 Containers
07 Containers
 

Destacado

cpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL Containerscpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL ContainersAmazon Web Services
 
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2Amazon Web Services
 
Css animation, html5 api
Css animation, html5 apiCss animation, html5 api
Css animation, html5 apieleksdev
 
Frontend basics
Frontend basicsFrontend basics
Frontend basicseleksdev
 
Angular. presentation
Angular. presentationAngular. presentation
Angular. presentationeleksdev
 
Communication in android
Communication in androidCommunication in android
Communication in androideleksdev
 
Improving rpc bkp
Improving rpc bkpImproving rpc bkp
Improving rpc bkpeleksdev
 
G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2eleksdev
 
Windows service
Windows serviceWindows service
Windows serviceeleksdev
 
SDLC. UX Role
SDLC. UX RoleSDLC. UX Role
SDLC. UX Roleeleksdev
 
Advanced styles
Advanced stylesAdvanced styles
Advanced styleseleksdev
 
Hello android world
Hello android worldHello android world
Hello android worldeleksdev
 
G rpc lection1
G rpc lection1G rpc lection1
G rpc lection1eleksdev
 
Lecture android best practices
Lecture   android best practicesLecture   android best practices
Lecture android best practiceseleksdev
 
Lecture java basics
Lecture   java basicsLecture   java basics
Lecture java basicseleksdev
 

Destacado (20)

cpp-2013 #18 Qt Part 2
cpp-2013 #18 Qt Part 2cpp-2013 #18 Qt Part 2
cpp-2013 #18 Qt Part 2
 
cpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL Containerscpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL Containers
 
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
cpp-2013 #12 Управління пам&rsquo;яттю Частина 2
 
cpp-2013 #3 OOP Basics
cpp-2013 #3 OOP Basicscpp-2013 #3 OOP Basics
cpp-2013 #3 OOP Basics
 
cpp-2013 #14 Основи Qt
cpp-2013 #14 Основи Qtcpp-2013 #14 Основи Qt
cpp-2013 #14 Основи Qt
 
Css animation, html5 api
Css animation, html5 apiCss animation, html5 api
Css animation, html5 api
 
Frontend basics
Frontend basicsFrontend basics
Frontend basics
 
Angular. presentation
Angular. presentationAngular. presentation
Angular. presentation
 
Rpc
RpcRpc
Rpc
 
Communication in android
Communication in androidCommunication in android
Communication in android
 
Improving rpc bkp
Improving rpc bkpImproving rpc bkp
Improving rpc bkp
 
G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2G rpc lection1_theory_bkp2
G rpc lection1_theory_bkp2
 
Windows service
Windows serviceWindows service
Windows service
 
SDLC. UX Role
SDLC. UX RoleSDLC. UX Role
SDLC. UX Role
 
Advanced styles
Advanced stylesAdvanced styles
Advanced styles
 
Hello android world
Hello android worldHello android world
Hello android world
 
G rpc lection1
G rpc lection1G rpc lection1
G rpc lection1
 
Lecture android best practices
Lecture   android best practicesLecture   android best practices
Lecture android best practices
 
Lecture java basics
Lecture   java basicsLecture   java basics
Lecture java basics
 
DAL
DALDAL
DAL
 

Similar a cpp-2013 #19 Concurrency

Lec13 14 багатопоточнiсть
Lec13 14 багатопоточнiстьLec13 14 багатопоточнiсть
Lec13 14 багатопоточнiстьcit-cit
 
System programing module 2. Threads
System programing module 2. ThreadsSystem programing module 2. Threads
System programing module 2. ThreadsAndrii Hladkyi
 
Lec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпеченняLec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпеченняcit-cit
 
Анімовані компоненти та навігація
Анімовані компоненти та навігаціяАнімовані компоненти та навігація
Анімовані компоненти та навігаціяПупена Александр
 

Similar a cpp-2013 #19 Concurrency (8)

Lec13 14 багатопоточнiсть
Lec13 14 багатопоточнiстьLec13 14 багатопоточнiсть
Lec13 14 багатопоточнiсть
 
базовI структури алгоритму урок 4
базовI структури алгоритму урок 4базовI структури алгоритму урок 4
базовI структури алгоритму урок 4
 
System programing module 2. Threads
System programing module 2. ThreadsSystem programing module 2. Threads
System programing module 2. Threads
 
Lec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпеченняLec16 промiжне програмне забезпечення
Lec16 промiжне програмне забезпечення
 
Модулі Python
Модулі PythonМодулі Python
Модулі Python
 
Automated testing
Automated testingAutomated testing
Automated testing
 
Анімовані компоненти та навігація
Анімовані компоненти та навігаціяАнімовані компоненти та навігація
Анімовані компоненти та навігація
 
Лекція №10
Лекція №10Лекція №10
Лекція №10
 

Más de Amazon Web Services

Más de Amazon Web Services (12)

cpp-2013 #17 Libraries
cpp-2013 #17 Librariescpp-2013 #17 Libraries
cpp-2013 #17 Libraries
 
cpp-2013 #16 Automated testing
cpp-2013 #16 Automated testingcpp-2013 #16 Automated testing
cpp-2013 #16 Automated testing
 
cpp-2013 #15 Databases
cpp-2013 #15 Databasescpp-2013 #15 Databases
cpp-2013 #15 Databases
 
cpp-2013 #13 C++11
cpp-2013 #13 C++11cpp-2013 #13 C++11
cpp-2013 #13 C++11
 
cpp-2013 #11 Constness and Exceptions
cpp-2013 #11 Constness and Exceptionscpp-2013 #11 Constness and Exceptions
cpp-2013 #11 Constness and Exceptions
 
cpp-2013 #9 STL Algorithms Part 1
cpp-2013 #9 STL Algorithms Part 1cpp-2013 #9 STL Algorithms Part 1
cpp-2013 #9 STL Algorithms Part 1
 
cpp-2013 #8 STL Containers Part 2
cpp-2013 #8 STL Containers Part 2cpp-2013 #8 STL Containers Part 2
cpp-2013 #8 STL Containers Part 2
 
cpp-2013 #6 OOP Part 2
cpp-2013 #6 OOP Part 2cpp-2013 #6 OOP Part 2
cpp-2013 #6 OOP Part 2
 
cpp-2013 #5 File and network input/output
cpp-2013 #5 File and network input/outputcpp-2013 #5 File and network input/output
cpp-2013 #5 File and network input/output
 
cpp-2013 #4 Memory management
cpp-2013 #4 Memory managementcpp-2013 #4 Memory management
cpp-2013 #4 Memory management
 
cpp-2013 #2 Organizing your code
cpp-2013 #2 Organizing your codecpp-2013 #2 Organizing your code
cpp-2013 #2 Organizing your code
 
cpp-2013 #1 C++ basics
cpp-2013 #1 C++ basicscpp-2013 #1 C++ basics
cpp-2013 #1 C++ basics
 

cpp-2013 #19 Concurrency

  • 2. Типові приклади використання Responsiveness Багатозадачність ОС Виконання операцій поза UI (I/O) Performance Обробка даних паралельно (CPU) Виконання кількох задач паралельно (CPU-CPU, CPU-I/O, I/O-I/O)
  • 3. Process Процес визначає virtual address space Досягається ізоляція, оскільки - процеси не можуть напряму адресувати пам’ять інших процесів Також можливе спільне використання: - спільна бібліотека може входити до адресного простору кількох процесів
  • 4. Процес не виконує код, а лише надає ресурси і контекст для виконання потоків
  • 5. Потоки (threads) виконують код Потоки виконуються в межах процесу Мають доступ до всього адресного простору процесу. Кожен потік має свій стек викликів (локальні змінні), вказівник поточної інструкції та значення регістрів CPU
  • 6. Виконання потоків у Windows - Багатозадачна ОС - Витісняюче планування на основі пріоритетів - (preemptive scheduling, priority-based) - CPU завжди виконує той потік, який має найвищий пріоритет (і який готовий до виконання)
  • 7. Планування (scheduling) Windows - Потік виконується протягом фіксованого інтервалу часу (time slice) - По закінченню інтервалу ОС перевіряє, чи є готовий потік з таким же пріоритетом - Якщо є, потік витісняється - Як тільки з’являється потік з вищим пріоритетом, потік витісняється - Навіть якщо його інтервал не закінчився
  • 8. Переключення контексту (context switching) Вибравши новий потік для виконання, ОС переключає контекст: Зберігається стан регістрів CPU + IP попереднього потоку Відновлюються регістри CPU нового потоку
  • 9. Потік звільняє CPU, коли: - Завершився time slice - Переходить в стан очікування самостійно - Диск, мережа, пам’ять (!), синхронізація - Витісняється потоком з вищим пріоритетом - Який закінчив щось очікувати (диск, мережа,...) - Пріоритет якого збільшився - Потік завершується - …
  • 10. Windows та Linux планують потоки, не процеси Наслідок: Процес А має 1 потік Процес Б має 9 потоків Процес Б отримає 90% процесорного часу (за умови однакового пріоритету потоків)
  • 11. UI message loop - Один GUI потік обробляє повідомлення з черги: - Clicks, repaints, mouse moves, key presses, … - Події обробляються послідовно - Отже, якщо одна подія займає довгий час, решта будуть чекати - Отже, довготривалі події ніколи не повинні виконуватись в UI потоці - I/O, важкі обчислення (див. наст. слайд)
  • 12. Довготривалі події ніколи не повинні виконуватись в UI потоці - UI потік не повинен блокуватись чекаючи завершення цих операцій - В т.ч. коли ці операції виконуються іншим потоком - Для повернення результатів – signals and slots - “Qt developers are used to working with this kind of asynchronous behavior” http://qt-project.org/doc/qt-5.0/qtcore/thread-basics.html
  • 13. Thread pool - Створювати і видаляти потоки дорого - Пул потоків виконує завдання використовуючи створений наперед набір потоків - Залежно від навантаження пул створює додаткові потоки або видаляє непотрібні
  • 14. Типові задачі - Поділити дані на частини і обробляти паралельно - Виконувати декілька незалежних задач паралельно - Виконати довготривалу операцію поза UI
  • 15. Паралелізм даних ... ... Thread 1 Thread 2
  • 18. Паралельні незалежні задачі Future Future Future Seq Seq Seq Seq Seq
  • 19. Операції поза UI DB Call Seq Seq Event loop
  • 20. Використання спільних даних auto count = 0; 100 { { int temp = count; count++; temp = temp + 1; }); count = temp; }
  • 21. Використання спільних даних count = 0 Потік A Потік B int temp = count; // 0 int temp = count; // 0 temp = temp + 1; // 1 temp = temp + 1; // 1 count = temp; // 1 count = temp; // 1 count = 1 // WRONG! Should be 2
  • 22. Доступ до спільних даних повинен бути синхронізованим auto count = 0; std::mutex mutex; mutex.lock(); { // ... mutex.unlock(); { std::lock_guard<std::mutex> lock(mutex); count++; }); Qt has its own bicycle } for this
  • 23. Використання спільних даних count = 0 Потік A Потік B mutex.lock(); int temp = count; // 0 mutex.lock(); temp = temp + 1; // 1 count = temp; // 1 mutex.unlock(); int temp = count; // 0 temp = temp + 1; // 1 count = temp; // 1 mutex.unlock();
  • 24. Синхронізацією керувати складно Багато нюансів, про які ми навіть не здогадуємось (як з count++) Second order ignorance http://c2.com/cgi/wiki?OrdersOfIgnorance Використовуйте готові засоби: алгоритми, конкурентні колекції, tasks, futures, QtConcurrent, QThreadPool, signals and slots
  • 25. Advanced Qt • Thread-safety and reentrance • Working with threads • Basic synchronization techniques • High-level concurrency API
  • 26. Working with threads • QThread - a wrapper around OS thread • do not subclass QThread • push processing objects to QThread instance • do not allocate heap memory in processing object constructor • be sure that thread is shut down when deleting QThread • be careful while connecting signals/slots in multithreading applications
  • 27. Basic synchronization techniques • QMutex and QMutexLocker • QReadWriteLock

Notas del editor

  1. Spin off the computation whose result will be needed later
  2. Spin off the computation whose result will be needed later
  3. Spin off the computation whose result will be needed later