SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
Примитивы синхронизации
Мьютексы
    На примере boost:
●   mutex
●   recursive_mutex
●   timed_mutex
●   recursive_timed_mutex
●   shared_mutex
●   spin_mutex
mutex && recursive_mutex
    Функции:
●   Захват: void lock();
●   Попытаться захватить: bool try_lock();
●   Освободить: void unlock();
timed_mutex &&
            recursive_timed_mutex
    Функции:
●   То же, что у mutex && recursive_mutex
    ➢   Захват: void lock();
    ➢   Попытаться захватить: bool try_lock();
    ➢   Освободить: void unlock();
●   + Захват с ограничением: timed_lock(...);
shared_mutex
    Функции:
●   То же, что у [recursive_]timed_mutex
    ●   Захват: void lock();
    ●   Попытаться захватить: bool try_lock();
    ●   Освободить: void unlock();
    ●   Захват с ограничением: void timed_lock(...);
●   + Захват на чтение: void [timed_]lock_shared();
●   + Захват на чтение с возможностью
    «дозахвата» на запись: void lock_upgrade();
spin_mutex
    Функции:
●   То же, что у timed_mutex
    ●   Захват: void lock();
    ●   Попытаться захватить: bool try_lock();
    ●   Освободить: void unlock();
    ●   Захват с ограничением: void timed_lock(...);
    Отличие:
●   Активное ожидание на захвате
Релизация spin_mutex
Замки
●   lock_guard
●   unique_lock
●   shared_lock
●   upgrade_lock
●   upgrade_to_unique_lock
lock_guard
●   Захват в конструкторе
●   Освобождение в деструкторе
●   Используются методы мьютексов
    ●   Захват: void lock();
    ●   Освободить: void unlock();
unique_lock
●   То же, что lock_guard
●   + Используются методы мьютексов
    ●   Попытаться захватить: bool try_lock();
    ●   Захват с ограничением: void timed_lock(...);
●   + Дополнительные функции получения
    мьютекса, проверки «захваченности»...
shared_lock
●   Предназначени для работы с shared_mutex
●   Захват на чтение
●   Освобождение в деструкторе
●   Используются методы мьютексов
    ●   Захват: void [timed_]lock_shared();
    ●   Освободить: void unlock_shared();
upgrade_lock
●   Предназначени для работы с shared_mutex
●   Захват на чтение с возможностью
    «дозахвата» на запись
●   Освобождение в деструкторе
●   Используются методы мьютексов
    ●   Захват: void lock_upgrade();
    ●   Освободить: void unlock_upgrade();
upgrade_to_unique_lock
●   Предназначени для работы с upgrade_lock
●   Захват на запись после захвата на чтение
●   Освобождение в деструкторе
●   Используются методы мьютексов
    ●   Захват: void unlock_upgrade_and_lock();
    ●   Освободить: void unlock_and_lock_upgrade();
Применение замков
●   Мьютекс имеет свой typedef на scoped_lock:
    ●   mutex:
          typedef unique_lock<mutex> scoped_lock;
    ●   recursive_mutex:
          typedef unique_lock<recursive_mutex> scoped_lock;
    ●   timed_mutex:
          typedef unique_lock<timed_mutex> scoped_timed_lock;
          typedef scoped_timed_lock scoped_lock;
●   Удобнее захватывать:
    boost::mutex::scoped_lock l(m);
CAS-операции
    CAS — compare-and-set, compare-and-swap
    bool compare_and_set(
    ●   int* <адрес переменной>,
    ●   int <старое значение>,
    ●   int <новое значение>)
✔   Возвращает признак успешности операции
    установки значения
✔   Атомарна на уровне процессора (CPU: i486+):
    cmpxchg
Преимущества CAS
●   Является аппаратным примитивом
●   Возможность продолжения захвата
    примитива без обязательного перехода в
    режим «ожидания»
●   Меньше вероятность возникновения
    блокировки из-за более мелкой операции
●   Более быстрая (правда не в условиях
    жёсткой конкуренции)
Пример CAS инкремента
/**
 * Atomically increments by one the current value.
 * @return the updated value
 */
public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}
Futex
    Futex - 'Fast Userspace muTexes'
●   Применяются для реализации POSIX mutex
●   Доступен с ядра 2.5.40
●   В реализации используется с CAS — почти
    все операции проводятся в пространстве
    пользователя
Реализация futex
174   static void
175   futexunlock(Lock *l)
176   {
177       uint32 v;
178
179       v = runtime·xchg(&l->key, MUTEX_UNLOCKED);
180       if(v == MUTEX_UNLOCKED)
181          runtime·throw("unlock of unlocked lock");
182       if(v == MUTEX_SLEEPING)
183          futexwakeup(&l->key, 1);
184   }
Критическая секция
●   Разница с мьютексом во многом
    терминологическая
●   Критическая секция — не объект ядра ОС
●   Использование аналогична pthread_mutex_t
    ➢   InitializeCriticalSection
    ➢   ::EnterCriticalSection(&m_lock);
    ➢   ::LeaveCriticalSection(&m_lock);
●   Для удобства также как и с мьютексами
    используются замки: CScopeLock...
Interlocked-функции
●   Тоже работают в пространстве пользователя, не
    переводя процесс в режим ожидания, так как
    основаны на CAS-операциях
●   Примеры:
    ➢   InterlockedIncrement(&var)
    ➢   InterlockedExchange
    ➢   InterlockedCompareExchange
    ➢   ...
Условные переменные
●   Нужны как механизм взаимодействия
    потоков, в отличие от мьютексов
●   Всегда используется с мьютексом
●   Предназначена для уведомления событии
●   Атомарно освобождает мьютекс при wait()
●   Хорошо подходит для задач типа
    «производитель-потребитель»
●   Для boost: boost::condition
Пример использования
public void prepareData() {                    public void sendData() {

    synchronized (monitor) {                       synchronized (monitor) {

        System.out.println("Data prepared");           System.out.println("Waiting for data...");

        ready = true;                                  while (!ready) {

        monitor.notifyAll();                               try {

    }                                                          monitor.wait();

}                                                          } catch (InterruptedException e) {
                                                               e.printStackTrace();
                                                           }
                                                       }
                                                       System.out.println("Sending data...");
                                                   }
                                               }
Графические библиотеки
●   Имеют цикл обработки событий
●   Физически || исполнения нет — обход
    синхронизации
●   Если графика не нагружена и есть всего 1
    вычислительно сложный поток — можно
    использовать «частые события». На Qt,
    например:
    ➢   Qtimer timer;
    ➢   connect(&timer,SIGNAL(timeout()),this,SLOT(step()));
    ➢   timer.start(0);
Оптимальное число потоков
Boost:
boost::thread::hardware_concurrency()


Java:
Runtime.getRuntime().availableProcessors()

Contenu connexe

Tendances

ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияcorehard_by
 
Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...
Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...
Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...Iosif Itkin
 
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...corehard_by
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package managercorehard_by
 
Lightweight Static Analysis for Data Race Detection in Operating System Kernels
Lightweight Static Analysis for Data Race Detection in Operating System KernelsLightweight Static Analysis for Data Race Detection in Operating System Kernels
Lightweight Static Analysis for Data Race Detection in Operating System KernelsIosif Itkin
 
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)Ontico
 
FreeRTOS
FreeRTOSFreeRTOS
FreeRTOSquakke
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Yandex
 
Protecting your mobile game from the most common hacks
Protecting your mobile game from the most common hacksProtecting your mobile game from the most common hacks
Protecting your mobile game from the most common hacksDevGAMM Conference
 
Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"railsclub
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахAleksander Alekseev
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.jsMad Devs
 

Tendances (20)

ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
 
Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...
Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...
Moscow Exchange Test Automation of a Backup System at TMPA-2014 (Trading Syst...
 
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
 
Lab5
Lab5Lab5
Lab5
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package manager
 
Lightweight Static Analysis for Data Race Detection in Operating System Kernels
Lightweight Static Analysis for Data Race Detection in Operating System KernelsLightweight Static Analysis for Data Race Detection in Operating System Kernels
Lightweight Static Analysis for Data Race Detection in Operating System Kernels
 
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
Anti-fraud solutions in RTB / Вадим Антонюк (IPONWEB)
 
FreeRTOS
FreeRTOSFreeRTOS
FreeRTOS
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
Protecting your mobile game from the most common hacks
Protecting your mobile game from the most common hacksProtecting your mobile game from the most common hacks
Protecting your mobile game from the most common hacks
 
Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
 

Similaire à 2012 03 14_parallel_programming_lecture05

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsAlexey Paznikov
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1921519
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
XP.Party (iOS) - unit tests frameworks overview
XP.Party (iOS) - unit tests frameworks overviewXP.Party (iOS) - unit tests frameworks overview
XP.Party (iOS) - unit tests frameworks overviewAnton Katkov
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
nginx internals
nginx internalsnginx internals
nginx internalsredivy
 
Веселая ферма. Соседи.
Веселая ферма. Соседи.Веселая ферма. Соседи.
Веселая ферма. Соседи.Doomer Samoiloff
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012dmalykhanov
 

Similaire à 2012 03 14_parallel_programming_lecture05 (20)

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Thread
ThreadThread
Thread
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
XP.Party (iOS) - unit tests frameworks overview
XP.Party (iOS) - unit tests frameworks overviewXP.Party (iOS) - unit tests frameworks overview
XP.Party (iOS) - unit tests frameworks overview
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
nginx internals
nginx internalsnginx internals
nginx internals
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Веселая ферма. Соседи.
Веселая ферма. Соседи.Веселая ферма. Соседи.
Веселая ферма. Соседи.
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
Lec 14
Lec 14Lec 14
Lec 14
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 

Plus de Computer Science Club

20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugsComputer Science Club
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12Computer Science Club
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11Computer Science Club
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10Computer Science Club
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09Computer Science Club
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02Computer Science Club
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01Computer Science Club
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01Computer Science Club
 

Plus de Computer Science Club (20)

20141223 kuznetsov distributed
20141223 kuznetsov distributed20141223 kuznetsov distributed
20141223 kuznetsov distributed
 
Computer Vision
Computer VisionComputer Vision
Computer Vision
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01
 
20140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-0320140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-03
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01
 
20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 
20131006 h10 lecture2_matiyasevich
20131006 h10 lecture2_matiyasevich20131006 h10 lecture2_matiyasevich
20131006 h10 lecture2_matiyasevich
 

2012 03 14_parallel_programming_lecture05

  • 2. Мьютексы На примере boost: ● mutex ● recursive_mutex ● timed_mutex ● recursive_timed_mutex ● shared_mutex ● spin_mutex
  • 3. mutex && recursive_mutex Функции: ● Захват: void lock(); ● Попытаться захватить: bool try_lock(); ● Освободить: void unlock();
  • 4. timed_mutex && recursive_timed_mutex Функции: ● То же, что у mutex && recursive_mutex ➢ Захват: void lock(); ➢ Попытаться захватить: bool try_lock(); ➢ Освободить: void unlock(); ● + Захват с ограничением: timed_lock(...);
  • 5. shared_mutex Функции: ● То же, что у [recursive_]timed_mutex ● Захват: void lock(); ● Попытаться захватить: bool try_lock(); ● Освободить: void unlock(); ● Захват с ограничением: void timed_lock(...); ● + Захват на чтение: void [timed_]lock_shared(); ● + Захват на чтение с возможностью «дозахвата» на запись: void lock_upgrade();
  • 6. spin_mutex Функции: ● То же, что у timed_mutex ● Захват: void lock(); ● Попытаться захватить: bool try_lock(); ● Освободить: void unlock(); ● Захват с ограничением: void timed_lock(...); Отличие: ● Активное ожидание на захвате
  • 8. Замки ● lock_guard ● unique_lock ● shared_lock ● upgrade_lock ● upgrade_to_unique_lock
  • 9. lock_guard ● Захват в конструкторе ● Освобождение в деструкторе ● Используются методы мьютексов ● Захват: void lock(); ● Освободить: void unlock();
  • 10. unique_lock ● То же, что lock_guard ● + Используются методы мьютексов ● Попытаться захватить: bool try_lock(); ● Захват с ограничением: void timed_lock(...); ● + Дополнительные функции получения мьютекса, проверки «захваченности»...
  • 11. shared_lock ● Предназначени для работы с shared_mutex ● Захват на чтение ● Освобождение в деструкторе ● Используются методы мьютексов ● Захват: void [timed_]lock_shared(); ● Освободить: void unlock_shared();
  • 12. upgrade_lock ● Предназначени для работы с shared_mutex ● Захват на чтение с возможностью «дозахвата» на запись ● Освобождение в деструкторе ● Используются методы мьютексов ● Захват: void lock_upgrade(); ● Освободить: void unlock_upgrade();
  • 13. upgrade_to_unique_lock ● Предназначени для работы с upgrade_lock ● Захват на запись после захвата на чтение ● Освобождение в деструкторе ● Используются методы мьютексов ● Захват: void unlock_upgrade_and_lock(); ● Освободить: void unlock_and_lock_upgrade();
  • 14. Применение замков ● Мьютекс имеет свой typedef на scoped_lock: ● mutex: typedef unique_lock<mutex> scoped_lock; ● recursive_mutex: typedef unique_lock<recursive_mutex> scoped_lock; ● timed_mutex: typedef unique_lock<timed_mutex> scoped_timed_lock; typedef scoped_timed_lock scoped_lock; ● Удобнее захватывать: boost::mutex::scoped_lock l(m);
  • 15. CAS-операции CAS — compare-and-set, compare-and-swap bool compare_and_set( ● int* <адрес переменной>, ● int <старое значение>, ● int <новое значение>) ✔ Возвращает признак успешности операции установки значения ✔ Атомарна на уровне процессора (CPU: i486+): cmpxchg
  • 16. Преимущества CAS ● Является аппаратным примитивом ● Возможность продолжения захвата примитива без обязательного перехода в режим «ожидания» ● Меньше вероятность возникновения блокировки из-за более мелкой операции ● Более быстрая (правда не в условиях жёсткой конкуренции)
  • 18. Futex Futex - 'Fast Userspace muTexes' ● Применяются для реализации POSIX mutex ● Доступен с ядра 2.5.40 ● В реализации используется с CAS — почти все операции проводятся в пространстве пользователя
  • 19. Реализация futex 174 static void 175 futexunlock(Lock *l) 176 { 177 uint32 v; 178 179 v = runtime·xchg(&l->key, MUTEX_UNLOCKED); 180 if(v == MUTEX_UNLOCKED) 181 runtime·throw("unlock of unlocked lock"); 182 if(v == MUTEX_SLEEPING) 183 futexwakeup(&l->key, 1); 184 }
  • 20. Критическая секция ● Разница с мьютексом во многом терминологическая ● Критическая секция — не объект ядра ОС ● Использование аналогична pthread_mutex_t ➢ InitializeCriticalSection ➢ ::EnterCriticalSection(&m_lock); ➢ ::LeaveCriticalSection(&m_lock); ● Для удобства также как и с мьютексами используются замки: CScopeLock...
  • 21. Interlocked-функции ● Тоже работают в пространстве пользователя, не переводя процесс в режим ожидания, так как основаны на CAS-операциях ● Примеры: ➢ InterlockedIncrement(&var) ➢ InterlockedExchange ➢ InterlockedCompareExchange ➢ ...
  • 22. Условные переменные ● Нужны как механизм взаимодействия потоков, в отличие от мьютексов ● Всегда используется с мьютексом ● Предназначена для уведомления событии ● Атомарно освобождает мьютекс при wait() ● Хорошо подходит для задач типа «производитель-потребитель» ● Для boost: boost::condition
  • 23. Пример использования public void prepareData() { public void sendData() { synchronized (monitor) { synchronized (monitor) { System.out.println("Data prepared"); System.out.println("Waiting for data..."); ready = true; while (!ready) { monitor.notifyAll(); try { } monitor.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("Sending data..."); } }
  • 24. Графические библиотеки ● Имеют цикл обработки событий ● Физически || исполнения нет — обход синхронизации ● Если графика не нагружена и есть всего 1 вычислительно сложный поток — можно использовать «частые события». На Qt, например: ➢ Qtimer timer; ➢ connect(&timer,SIGNAL(timeout()),this,SLOT(step())); ➢ timer.start(0);