🗊Презентация Параллельное программирование. С++. Thread Support Library. Atomic Operations Library

Нажмите для полного просмотра!
Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №1Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №2Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №3Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №4Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №5Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №6Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №7Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №8Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №9Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №10Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №11Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №12Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №13Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №14Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №15Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №16Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №17Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №18Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №19Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №20Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №21Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №22Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №23Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №24Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №25Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №26Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №27Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №28Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №29Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №30Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №31Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №32Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №33Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №34Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №35Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №36Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №37Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №38Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №39Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №40Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №41Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №42Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №43Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №44Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №45Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №46Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №47Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №48Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №49Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №50Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №51Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №52Параллельное программирование. С++. Thread Support Library. Atomic Operations Library, слайд №53

Содержание

Вы можете ознакомиться и скачать презентацию на тему Параллельное программирование. С++. Thread Support Library. Atomic Operations Library. Доклад-сообщение содержит 53 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Параллельное программирование
С++. Thread Support Library.
Atomic Operations Library.
Описание слайда:
Параллельное программирование С++. Thread Support Library. Atomic Operations Library.

Слайд 2





Развитие параллельного программирования в С++
Posix threads
pthread_create 
Windows Threads
CreateThread
OpenMPI
omp parallel
С++ Thread  Support & Atomic Operations Libraries
Нужна минимум 
VS2012 (лучше VS2015)
GCC 4.8.1
Или 100 евро, чтобы купить just::thread
Описание слайда:
Развитие параллельного программирования в С++ Posix threads pthread_create Windows Threads CreateThread OpenMPI omp parallel С++ Thread Support & Atomic Operations Libraries Нужна минимум VS2012 (лучше VS2015) GCC 4.8.1 Или 100 евро, чтобы купить just::thread

Слайд 3





std::thread
std::thread – стандартный класс потока
это не конкурент Windows и/или POSIX потокам
это обертка, которая внутри использует либо Windows-потоки, либо POSIX-потоки в зависимости от компилятора и платформы
Описание слайда:
std::thread std::thread – стандартный класс потока это не конкурент Windows и/или POSIX потокам это обертка, которая внутри использует либо Windows-потоки, либо POSIX-потоки в зависимости от компилятора и платформы

Слайд 4





Простой пример для std::thread
#include <thread>
void ThreadProc()
{
  printf(“Inside thread = %d”, std::this_thread::get_id());
}
std::thread t(ThreadProc);
…
t.join();
Описание слайда:
Простой пример для std::thread #include <thread> void ThreadProc() { printf(“Inside thread = %d”, std::this_thread::get_id()); } std::thread t(ThreadProc); … t.join();

Слайд 5





Обработка исключений
Любое исключение – вылет, падение
Привет исключениям по любому поводу, Boost!
void ThreadProc()
{
	try
	{
		// вычисления
	}
	catch (…)
	{
		// обработка исключения
	}
}
Описание слайда:
Обработка исключений Любое исключение – вылет, падение Привет исключениям по любому поводу, Boost! void ThreadProc() { try { // вычисления } catch (…) { // обработка исключения } }

Слайд 6





Копирование потоков std::thread
Прямое копирование – ошибка компиляции
std::thread t(ThreadFunc);
t2 = t;
std::thread t3(t);
std::thread t2(std::move(t)); // t невалидно
std::thread& t3 = t2; // валидно t2 и t3, но 				 // это один и тот же 					 // объект
Описание слайда:
Копирование потоков std::thread Прямое копирование – ошибка компиляции std::thread t(ThreadFunc); t2 = t; std::thread t3(t); std::thread t2(std::move(t)); // t невалидно std::thread& t3 = t2; // валидно t2 и t3, но // это один и тот же // объект

Слайд 7





Всегда надо join до пропадания std::thread из области видимости
#include <thread>
void ThreadProc()
{
  printf(“Inside thread = %d”, std::this_thread::get_id());
}
std::thread t(ThreadProc);
…
t.join();
Описание слайда:
Всегда надо join до пропадания std::thread из области видимости #include <thread> void ThreadProc() { printf(“Inside thread = %d”, std::this_thread::get_id()); } std::thread t(ThreadProc); … t.join();

Слайд 8





Function objects
Второй способ создания объектов std::thread
class FuncObject
{
public:
	void operator() (void)
		{ cout << this_thread::get_id() << endl; }
};
FuncObject f;
std::thread t( f );
Описание слайда:
Function objects Второй способ создания объектов std::thread class FuncObject { public: void operator() (void) { cout << this_thread::get_id() << endl; } }; FuncObject f; std::thread t( f );

Слайд 9





Лямбда-выражения
Описание слайда:
Лямбда-выражения

Слайд 10





Потоки через лямбда-функции + передача параметров в потоки
Описание слайда:
Потоки через лямбда-функции + передача параметров в потоки

Слайд 11





Лямбда-функции vs обычные функции vs Function objects
Разница в читаемости – на любителя
При использовании лямбда-функций есть накладные расходы на создание объекта
При использовании function objects тоже есть накладные расходы на создание объекта
Описание слайда:
Лямбда-функции vs обычные функции vs Function objects Разница в читаемости – на любителя При использовании лямбда-функций есть накладные расходы на создание объекта При использовании function objects тоже есть накладные расходы на создание объекта

Слайд 12





Методы std::thread
joinable – можно ли ожидать завершения потока (находимся ли мы в параллельном относительно этого потоке)
get_id – возвращает ID потока
native_handle – возвращает хендл потока (зависит от работающей реализации потоков)
hardware_concurency – сколько потоков одновременно могут работать
Описание слайда:
Методы std::thread joinable – можно ли ожидать завершения потока (находимся ли мы в параллельном относительно этого потоке) get_id – возвращает ID потока native_handle – возвращает хендл потока (зависит от работающей реализации потоков) hardware_concurency – сколько потоков одновременно могут работать

Слайд 13





Методы std::thread
join – ожидать завершения потока
detach – разрешить потоку работать вне зависимости от объекта std::thread
swap – поменять два потока местами
std::swap – работает с объектами типа std::thread
Описание слайда:
Методы std::thread join – ожидать завершения потока detach – разрешить потоку работать вне зависимости от объекта std::thread swap – поменять два потока местами std::swap – работает с объектами типа std::thread

Слайд 14





Методы std::this_thread
yield – дать поработать другим потокам
get_id – вернуть ID текущего потока
sleep_for – «заснуть» на заданное время
sleep_until – «заснуть» до заданного времени
std::chrono::milliseconds duration(2000);
std::this_thread::sleep_for(duration);
Описание слайда:
Методы std::this_thread yield – дать поработать другим потокам get_id – вернуть ID текущего потока sleep_for – «заснуть» на заданное время sleep_until – «заснуть» до заданного времени std::chrono::milliseconds duration(2000); std::this_thread::sleep_for(duration);

Слайд 15





Недостатки std::thread
Нет thread affinity
Нет размера стека
для MSVC 2010 и выше не актуально
Нет завершения потока
в pthread есть вполне приемлимая реализация
Нет статуса работы потока
Нет кода выхода потоковой функции
Описание слайда:
Недостатки std::thread Нет thread affinity Нет размера стека для MSVC 2010 и выше не актуально Нет завершения потока в pthread есть вполне приемлимая реализация Нет статуса работы потока Нет кода выхода потоковой функции

Слайд 16





std::future
Future – это высокоуровневая абстракция
Вы начинаете асинхронную операцию
Вы возвращаете хендл, чтобы ожидать результат
Создание потоков, ожидание выполнение, исключения и пр – делаются автоматически
Описание слайда:
std::future Future – это высокоуровневая абстракция Вы начинаете асинхронную операцию Вы возвращаете хендл, чтобы ожидать результат Создание потоков, ожидание выполнение, исключения и пр – делаются автоматически

Слайд 17





std::async + std::future
Описание слайда:
std::async + std::future

Слайд 18





Где работает асинхронная операция?
«Ленивое» исполнение в главном потоке
future<T> f1 = 
std::async( std::launch::deferred, []() -> T {...} );
Выполнение в отдельном потоке
future<T> f2 = std::async( std::launch::async, []() -> T {...} );
Пусть система решит, она умнее
future<T> f3 = std::async(     []() -> T {...} );
Описание слайда:
Где работает асинхронная операция? «Ленивое» исполнение в главном потоке future<T> f1 = std::async( std::launch::deferred, []() -> T {...} ); Выполнение в отдельном потоке future<T> f2 = std::async( std::launch::async, []() -> T {...} ); Пусть система решит, она умнее future<T> f3 = std::async( []() -> T {...} );

Слайд 19





Wait For
Аналог try-to-lock
std::future<int> f;
….
auto status = f.wait_for(std::chrono::milliseconds(10));
if (status == std::future_status::ready) 
{
}
Описание слайда:
Wait For Аналог try-to-lock std::future<int> f; …. auto status = f.wait_for(std::chrono::milliseconds(10)); if (status == std::future_status::ready) { }

Слайд 20





std::shared_future
Аналог std::future, но позволяет копировать себя и позволяет ожидать себя нескольким потокам
Например, чтобы можно было протащить future в несколько потоков и ждать его во всех них.
Метод share объекта std::future возвращает эквивалентный std::shared_future
Описание слайда:
std::shared_future Аналог std::future, но позволяет копировать себя и позволяет ожидать себя нескольким потокам Например, чтобы можно было протащить future в несколько потоков и ждать его во всех них. Метод share объекта std::future возвращает эквивалентный std::shared_future

Слайд 21





Методы std::future / std::shared_future
wait – ждать результат
get – получить результат
wait_for – ожидать результат с таймаутом
wait_until – ожидать результат максимум до заданного момента
Описание слайда:
Методы std::future / std::shared_future wait – ждать результат get – получить результат wait_for – ожидать результат с таймаутом wait_until – ожидать результат максимум до заданного момента

Слайд 22





std::packaged_task
std::packaged_task<int(int,int)> task([](int a, int b) { return std::pow(a, b); }); 
std::future<int> result = task.get_future();   
task(2, 9);
std::packaged_task<int(int,int)> task(f);
std::future<int> result = task.get_future();
task();
std::packaged_task<int()> task(std::bind(f, 2, 11));
std::future<int> result = task.get_future();   
task();
Описание слайда:
std::packaged_task std::packaged_task<int(int,int)> task([](int a, int b) { return std::pow(a, b); }); std::future<int> result = task.get_future();   task(2, 9); std::packaged_task<int(int,int)> task(f); std::future<int> result = task.get_future(); task(); std::packaged_task<int()> task(std::bind(f, 2, 11)); std::future<int> result = task.get_future();   task();

Слайд 23





Зачем нужен std::packaged_task? 
Реиспользование
Разная реализация
Запуск на разных данных
Описание слайда:
Зачем нужен std::packaged_task? Реиспользование Разная реализация Запуск на разных данных

Слайд 24





Методы std::packaged_task 
valid – возвращает, установлена ли функция
swap – меняет два packaged_task местами
get_future – возвращает объект future
operator () – запускает функцию
reset – сбрасывает результаты вычислений
make_ready_at_thread_exit – запускает функцию, однако результат не будет известен до окончания работы текущего потока
Описание слайда:
Методы std::packaged_task valid – возвращает, установлена ли функция swap – меняет два packaged_task местами get_future – возвращает объект future operator () – запускает функцию reset – сбрасывает результаты вычислений make_ready_at_thread_exit – запускает функцию, однако результат не будет известен до окончания работы текущего потока

Слайд 25





Promises
std::future дает возможность вернуть значение из потока после завершения потоковой функции
std::promise это объект, который можно протащить в потоковую функцию, чтобы вернуть значение из потока до завершения потоковой функции
Описание слайда:
Promises std::future дает возможность вернуть значение из потока после завершения потоковой функции std::promise это объект, который можно протащить в потоковую функцию, чтобы вернуть значение из потока до завершения потоковой функции

Слайд 26





std::promise
void ThreadProc(std::promise<int>& promise)
{
…
promise.set_value(2));    //-- (3)
	…				
}
std::promise<int> promise; //-- (1)
std::thread thread(ThreadProc, std::ref(promise)); //-- (2)
std::future<int> result(promise.get_future()); //-- (4)
printf(“thread returns value = %d”, result.get()) //-- (5)
Описание слайда:
std::promise void ThreadProc(std::promise<int>& promise) { … promise.set_value(2));    //-- (3) … } std::promise<int> promise; //-- (1) std::thread thread(ThreadProc, std::ref(promise)); //-- (2) std::future<int> result(promise.get_future()); //-- (4) printf(“thread returns value = %d”, result.get()) //-- (5)

Слайд 27





Методы std::promise
operator == - можно копировать
swap – обменять местами
set_value – установить возвращаемое значение
set_value_at_thread_exit – установить возвращаемое значение, но сделать его доступным только когда поток завершится
set_exception – сохранить исключение, которое произошло
set_exception_at_thread_exit – сохранить исключение, но сделать его доступным только после окончания работы потока
Описание слайда:
Методы std::promise operator == - можно копировать swap – обменять местами set_value – установить возвращаемое значение set_value_at_thread_exit – установить возвращаемое значение, но сделать его доступным только когда поток завершится set_exception – сохранить исключение, которое произошло set_exception_at_thread_exit – сохранить исключение, но сделать его доступным только после окончания работы потока

Слайд 28





Locking
Описание слайда:
Locking

Слайд 29





“Smart” locking
Описание слайда:
“Smart” locking

Слайд 30





Методы std::mutex
lock – захватить мьютекс
unlock – освободить мьютекс
try_lock – попробовать захватить мьютекс с таймаутом 0 секунд и возвратить, успешно или нет
native_handle – хендл мьютекса (зависит от реализации)
Описание слайда:
Методы std::mutex lock – захватить мьютекс unlock – освободить мьютекс try_lock – попробовать захватить мьютекс с таймаутом 0 секунд и возвратить, успешно или нет native_handle – хендл мьютекса (зависит от реализации)

Слайд 31





Другие виды мьютексов
std::timed_mutex – мьютекс, который можно попробовать захватить с ненулевым таймаутом
std::recursive_mutex – мьютекс, который может быть многократно захвачен одним и тем же потоком
std::recursive_timed_mutex – смесь std::timed_mutex и std::recursive_mutex
Описание слайда:
Другие виды мьютексов std::timed_mutex – мьютекс, который можно попробовать захватить с ненулевым таймаутом std::recursive_mutex – мьютекс, который может быть многократно захвачен одним и тем же потоком std::recursive_timed_mutex – смесь std::timed_mutex и std::recursive_mutex

Слайд 32





Методы для timed мьютексов
try_lock_for – попытка захватить мьютекс с заданным таймаутом и возвратом успешности операции
try_lock_until – попытка захватить мьютекс максимум до заданного времени и возвратом успешности операции
Описание слайда:
Методы для timed мьютексов try_lock_for – попытка захватить мьютекс с заданным таймаутом и возвратом успешности операции try_lock_until – попытка захватить мьютекс максимум до заданного времени и возвратом успешности операции

Слайд 33





std::shared_timed_mutex (C++ 14)
Объект, который позволяет эксклюзивно захватывать мьютекс и неэксклюзивно.
Если мьютекс захвачен эксклюзивно, то неэксклюзивно захватить его нельзя (ожидание). Обратное верно.
Неэксклюзивный захват может быть из нескольких потоков одновременно
Описание слайда:
std::shared_timed_mutex (C++ 14) Объект, который позволяет эксклюзивно захватывать мьютекс и неэксклюзивно. Если мьютекс захвачен эксклюзивно, то неэксклюзивно захватить его нельзя (ожидание). Обратное верно. Неэксклюзивный захват может быть из нескольких потоков одновременно

Слайд 34





std::shared_timed_mutex
Зачем нужно?
На чтение защищенный ресурс можно открыть из нескольких потоков без возникновения проблем
На запись можно открыть только одному потоку, причем чтобы в этот момент никто не читал – чтобы проблем не было
Описание слайда:
std::shared_timed_mutex Зачем нужно? На чтение защищенный ресурс можно открыть из нескольких потоков без возникновения проблем На запись можно открыть только одному потоку, причем чтобы в этот момент никто не читал – чтобы проблем не было

Слайд 35





std::shared_timed_mutex
Эксклюзивный доступ
lock
try_lock
try_lock_for
try_lock_until
unlock
Описание слайда:
std::shared_timed_mutex Эксклюзивный доступ lock try_lock try_lock_for try_lock_until unlock

Слайд 36





std::shared_timed_mutex
Неэксклюзиный доступ
lock_shared
try_shared_lock
try_shared_lock_for
try_shared_lock_until
unlock_shared
Описание слайда:
std::shared_timed_mutex Неэксклюзиный доступ lock_shared try_shared_lock try_shared_lock_for try_shared_lock_until unlock_shared

Слайд 37





Общие алгоритмы захвата
std::lock
	std::lock(mutex1, mutex2, …, mutexN);
std::try_lock – c нулевым таймаутом
	std::try_lock(mutex1, mutex2, …, mutexN);
Описание слайда:
Общие алгоритмы захвата std::lock std::lock(mutex1, mutex2, …, mutexN); std::try_lock – c нулевым таймаутом std::try_lock(mutex1, mutex2, …, mutexN);

Слайд 38





std::call_once & std::once_flag
std::once_flag flag;   
void do_once() 
{ 
	std::call_once(flag, []() { printf(“called once”); }); 
}   
std::thread t1(do_once); 
std::thread t2(do_once); 
t1.join(); t2.join();
Описание слайда:
std::call_once & std::once_flag std::once_flag flag;   void do_once() { std::call_once(flag, []() { printf(“called once”); }); }   std::thread t1(do_once); std::thread t2(do_once); t1.join(); t2.join();

Слайд 39





Умные указатели для примитивов синхронизации
Для обоих нельзя копировать, можно переносить. Различия
std::unique_lock – обертка для эксклюзивного доступа
std::shared_lock (C++ 14) – обертка для неэксклюзивного доступа
Описание слайда:
Умные указатели для примитивов синхронизации Для обоих нельзя копировать, можно переносить. Различия std::unique_lock – обертка для эксклюзивного доступа std::shared_lock (C++ 14) – обертка для неэксклюзивного доступа

Слайд 40





Методы std::shared_lock / std::unique_lock
operator = разблокирует текущий мьютекс и становится оберткой над новым
lock
try_lock
try_lock_for
try_lock_until
unlock
Описание слайда:
Методы std::shared_lock / std::unique_lock operator = разблокирует текущий мьютекс и становится оберткой над новым lock try_lock try_lock_for try_lock_until unlock

Слайд 41





Методы std::shared_lock / std::unique_lock
swap – обменять примитив синхронизации с другим объектом ?_lock
release – отсоединить текущий примитив синхронизации без unlock
mutex – возвращает ссылку на текущий примитив синхронизации
owns_lock – возвращает true, если управляет примитивом синхронизации
Описание слайда:
Методы std::shared_lock / std::unique_lock swap – обменять примитив синхронизации с другим объектом ?_lock release – отсоединить текущий примитив синхронизации без unlock mutex – возвращает ссылку на текущий примитив синхронизации owns_lock – возвращает true, если управляет примитивом синхронизации

Слайд 42





Стратегии захвата примитива синхронизации в конструкторе
std::lock_guard<std::mutex> lock1(m1, std::adopt_lock); 
std::lock_guard<std::mutex> lock2(m2, std::defer_lock);
std::defer_lock – не захватывать мьютекс
std::try_to_lock – попробовать захватить с нулевым таймаутом
std::adopt_lock – считать, что текущий поток уже захватил мьютекс
Описание слайда:
Стратегии захвата примитива синхронизации в конструкторе std::lock_guard<std::mutex> lock1(m1, std::adopt_lock); std::lock_guard<std::mutex> lock2(m2, std::defer_lock); std::defer_lock – не захватывать мьютекс std::try_to_lock – попробовать захватить с нулевым таймаутом std::adopt_lock – считать, что текущий поток уже захватил мьютекс

Слайд 43





Событие: std::condition_variable
notify_one – уведомить о событии 1 поток
notify_all – уведомить о событии все потоки
wait – ждать события
wait_for – ждать события с таймаутом
wait_until – ждать события не дольше, чем до заданного времени
native_handle – вернуть хендл события (зависит от реализации)
Описание слайда:
Событие: std::condition_variable notify_one – уведомить о событии 1 поток notify_all – уведомить о событии все потоки wait – ждать события wait_for – ждать события с таймаутом wait_until – ждать события не дольше, чем до заданного времени native_handle – вернуть хендл события (зависит от реализации)

Слайд 44





std::atomic
Описание слайда:
std::atomic

Слайд 45





std::atomic<T>
Шаблонный тип данных для цифровых переменных (char, short, int, int64, etc) и указателей
Почти всегда lock-free, а если и не lock-free, то не требует написания lock-ов вами.
Главное отличие – гонки данных исключены. 
Зато возможные операции крайне ограничены.
Описание слайда:
std::atomic<T> Шаблонный тип данных для цифровых переменных (char, short, int, int64, etc) и указателей Почти всегда lock-free, а если и не lock-free, то не требует написания lock-ов вами. Главное отличие – гонки данных исключены. Зато возможные операции крайне ограничены.

Слайд 46





std::atomic
operator = приравнивает один атомик другому
is_lock_free – возвращает, является ли реализация для этого типа данных lock free
store – загружает в атомик новое значение
load – получает из атомика значение
exchange – заменяет значение атомика и возвращает прошлое значение
Описание слайда:
std::atomic operator = приравнивает один атомик другому is_lock_free – возвращает, является ли реализация для этого типа данных lock free store – загружает в атомик новое значение load – получает из атомика значение exchange – заменяет значение атомика и возвращает прошлое значение

Слайд 47





std::atomic
fetch_add, fetch_sub, fetch_and, fetch_or, fetch_xor – выполняет сложение, вычитание, логические И, ИЛИ, XOR и возвращает предыдущее значение
operator++
operator++(int)
operator--
operator--(int) 
operator+=
operator-=
operator&=
operator|=
operator^=
Описание слайда:
std::atomic fetch_add, fetch_sub, fetch_and, fetch_or, fetch_xor – выполняет сложение, вычитание, логические И, ИЛИ, XOR и возвращает предыдущее значение operator++ operator++(int) operator-- operator--(int) operator+= operator-= operator&= operator|= operator^=

Слайд 48





std::atomic_flag
operator = - присвоение
clear – сброс флага в false
test_and_set – устанавливает флаг в true и возвращает предыдущее значение
Описание слайда:
std::atomic_flag operator = - присвоение clear – сброс флага в false test_and_set – устанавливает флаг в true и возвращает предыдущее значение

Слайд 49





Что еще есть в C++ 11 Atomic Operations Library?
Дублирование всех методов внешними операциями (.swap -> std::swap)
Compare And Swap (CAS)
И еще много всего 
для тех, кто 
слишком хорошо 
понимает, что 
делает
Описание слайда:
Что еще есть в C++ 11 Atomic Operations Library? Дублирование всех методов внешними операциями (.swap -> std::swap) Compare And Swap (CAS) И еще много всего для тех, кто слишком хорошо понимает, что делает

Слайд 50





Общие впечатления
Шаг вперед по адекватности и однообразию
Местами шаг назад. Сравните
Sleep(100)
и
std::chrono::milliseconds duration(100);
std::this_thread::sleep_for(duration);
Описание слайда:
Общие впечатления Шаг вперед по адекватности и однообразию Местами шаг назад. Сравните Sleep(100) и std::chrono::milliseconds duration(100); std::this_thread::sleep_for(duration);

Слайд 51





Общие впечатления
Впервые потоки, примитивы синхронизации стандартизированы
Некоторые устоявшиеся термины и подходы исключены (семафор; код, возвращаемый потоковой функцией; принудительное завершение потока; thread affinity; размер стека)
Некоторые совсем
Для некоторых непривычные аналоги
Описание слайда:
Общие впечатления Впервые потоки, примитивы синхронизации стандартизированы Некоторые устоявшиеся термины и подходы исключены (семафор; код, возвращаемый потоковой функцией; принудительное завершение потока; thread affinity; размер стека) Некоторые совсем Для некоторых непривычные аналоги

Слайд 52





Общие впечатления
В целом функциональности много, есть полезные нововведения, которые позволяют свести необходимость программировать синхронизацию к нулю.
Однако, с другой стороны отсутствие определенной функциональности, мягко говоря, смущает.
Описание слайда:
Общие впечатления В целом функциональности много, есть полезные нововведения, которые позволяют свести необходимость программировать синхронизацию к нулю. Однако, с другой стороны отсутствие определенной функциональности, мягко говоря, смущает.

Слайд 53





Вопросы
Описание слайда:
Вопросы



Похожие презентации
Mypresentation.ru
Загрузить презентацию