SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
Контейнеры и многороточность.
Вместе или врозь?
Антон Потапов,
Intel Corporation,
Нижний новгород, 2014
STL
• Контейнеры в С++ = STL
• Обще-принятый стандарт
• Интерфейс STL - Модель для подражания
других библиотек
STL.
Некоторые важные принципы.
• Декомпозиция. Один метод – одна задача.
• Гарантии безопасности при «исключениях»
• Адаптеры (stack, queue, priority_queue)
• Итераторы
STL. std::stack.
template<typename _Tp, typename _Sequence =
deque<_Tp> >
class stack
{
_Sequence c;
public:
typedef typename _Sequence::value_type
value_type;
bool empty() const {return c.size();}
value_type& top() {return c.back();}
void pop() {return c.pop_back();}
void push(const value_type& x)
{c.push_back(x);}
…
};
std::stack<non_pod> stack;
…
if (!stack.empty()){
non_pod e = stack.top();
stack.pop();
…
}
Гарантии потоко безопасности STL в
С++11
• Без дополнительной синхронизации, С++11 позволяет
вызывать паралельно только не модифицирующие
(const) методы STL контейнеров
17.6.5.9 Data race avoidance (in C++ standard library) [res.on.data.races]
......
2. A C++ standard library function shall not directly or indirectly access objects (1.10)
accessible by threads other than the current thread unless the objects are accessed
directly or indirectly via the function’s arguments, including this.
3. A C++ standard library function shall not directly or indirectly modify objects (1.10)
accessible by threads other than the current thread unless the objects are accessed
directly or indirectly via the function’s non-const arguments, including this.
STL. std::concurrent_stack ?
template<typename _Tp, typename
_Sequence = deque<_Tp> >
class stack
{
_Sequence c;
mutex mtx;
public:
bool empty() const {
lock_guard g(mtx);
return c.size();
}
…
};
std::stack<non_pod> stack;
…
if (!stack.empty()){
non_pod e = stack.top();
stack.pop();
…
}
Конкурентное использование STL.
std::stack<non_pod> stack;
mutex mtx;
…
{
lock_guard g(mtx);
if (!stack.empty()){
non_pod e = stack.top();
stack.pop();
…
}
}
std::stack Итерирование
std::map<int, non_pod> map;
typedef std::map<int, non_pod>::iterator it_t;
mutex mtx;
…
{
lock_guard g(mtx);
for(it_t it = map.begin(); it != map.end();
++it)
{
calc((*it).second);
}
}
• Необходима внешняя (по отношению к STL контейнеру)
синхронизация!
• Невозможно добавить потокобезопасность как итеративную
надстройку над серийным контейнером.
Конкурентное использование STL.
Выводы
• STL это эффективные _серийные_
контейнеры.
Value based VS reference based
• reference based (STL – яркий пример)
– Плюсы:
• Эффективность (отсутствие ненужных копирований)
• Высокие гарантии потокобезопасности
– Минусы:
• 3 метода вместо одного
• Время жизни обьектов контейнера
• Value based
– Все с точностью до наооборот
Value based VS Reference based
std::stack<non_pod> stack;
mutex mtx;
…
{
lock_guard g(mtx);
if (!stack.empty()){
non_pod e = stack.top();
stack.pop();
…
}
}
concurrent_stack<non_pod>
stack;
…
{
non_pod t;
if (!stack.try_pop(t)){
calc(t);
…
}
}
«Транзакционный» интерфейс ?
• try_pop()
• pop_if_not_empty()
• delete_if_present()
• ….
• Транзакционная память ?
Замки и «не замки» (Locks and lock
free) – немного теории
Замки. Частые проблемы.
• Взаи́мная блокиро́вка
• Голодание
• Инверсия приоритетов
Взаимная блокировка
• Взаи́мная блокиро́вка (англ. deadlock) —
ситуация в многозадачной среде или СУБД,
при которой несколько процессов
находятся в состоянии бесконечного
ожидания ресурсов, занятых самими этими
процессами. (Википедия)
Взаимная блокировка.
Методы решения.
• Иерархии замков
• Захват всех необходимых замков одним
вызовом
• Упорядочивание замков (например по
адресу)
Взаимная блокировка.
Стек
template< typename T >
class stack {
class node{
node* next;
T data;
node(const T& t)
:data(t) {}
};
node* head;
mutex mtx;
…
};
void push(const T& t){
lock_guard lck(mtx);
node * p_node = new node(t);
p_node->next = head;
head = p_node;
}
Нельзя звать «чужой» код под замком !
Взаимная блокировка.
Правильный вариант стека
template< typename T >
class stack {
class node{
node* next;
T data;
node(const T& t)
:data(t) {}
};
node* head;
mutex mtx;
…
};
void push(const T& t){
node * p_node = new node(t);
lock_guard lck(mtx);
p_node->next = head;
head = p_node;
}
};
Замки. Стек. Гарантии при работе с
исключениями.
template< typename T >
class stack {
class node{
node* next;
T data;
node(const T& t)
:data(t) {}
};
node* head;
mutex mtx;
…
};
T pop(){
node * p_node;
{
lock_guard lck(mtx);
p_node = head;
head = head->next;
}
std::auto_ptr<node> p(p_node);
return p_node->data;
}
};
«Не замки» (lock free) – немного
теории
“Не замки” (Lock free programming).
Зачем это надо
• Не использутся блокировки – нет связанных
с ними проблем
• Гарантия прогресса всей системы в целом,
даже в случае краха одного из потоков
• Обычно способствует увеличению
производительсности
“Не замки” (Lock free programming).
CAS
• Сравнение с обменом (англ. compare and set, compare and swap, CAS) —
атомарная инструкция, сравнивающая значение в памяти с одним из
аргументов, и в случае успеха записывающая второй аргумент в память.
(Википедия)
• [atomics.types.operations.req]:
template<typename T>
bool atomic<T>::compare_exchange_weak(T& expected, T
desired, memory_order m = memory_order_seq_cst) noexcept;
– expected – “старое”, ожидаемое значение атомарной переменной
– desired – новое значение, которое хотим записать
– Эффект: Сравнивает содержимое памяти по адресам this и
&expected, и, в случае равенства, записывает содержимое desired в
*this. В случае не равенства, записывает содержимое *this в в
expected.
Сравнение и запись происходят, атомарно, как одна интсрукция.
– Returns: Результат сравнения.
“Не замки” (Lock free programming).
Stack
template<typename T>
class lock_free_stack {
class node{
node* next;
T data;
node(const T& t): data(t) {}
};
atomic<node*> head;
public:
lock_free_stack(){ head.store(NULL);}
void push(const T& t){
node * p_node = new node(t);
node* old_head_value = head.load();
do {
p_node->next = old_head_value;
} while (!head.compare_exchange_weak(old_head_value,
p_node));
}
};
“Не замки” (Lock free programming).
Stack
template<typename T>
class lock_free_stack {
class node{
node* next;
T data;
node(const T& t): data(t) {}
};
atomic<node*> head;
public:
lock_free_stack(){ head.store(NULL);}
…
T pop(){
node* old_head_value = head.load();
while (!head.compare_exchange_weak(old_head_value, old_head_value.next));
T tmp = old_head_value.data;
delete old_head_value;
return tmp;
}
};
Ууупс 
“Не замки” (Lock free programming).
Время жизни.
T pop(){
node* old_head_value = head.load();
while (!head.compare_exchange_weak(
old_head_value, old_head_value->next)
);
T tmp = old_head_value.data;
delete old_head_value;
return tmp;
}
template<typename T>
class lock_free_stack {
class node{
node* next;
T data;
node(const T& t): data(t) {}
};
atomic<node*> head;
public:
lock_free_stack(){ head.store(NULL);}
…
};
T pop(){
node* old_head_value = head.load();
while (!head.compare_exchange_weak(
old_head_value, old_head_value->next)
);
T tmp = old_head_value.data;
delete old_head_value;
return tmp;
}
• Не удалять а переиспользовать обьекты
• Счетчик ссылок (внешний)
• Сборщик мусора
• Safe Memory Reclamation schemes
– Hazard Pointers
– Pass the Buck
“Не замки” (Lock free programming).
Время жизни обьектов. Способы
решения
• проблема ABA возникает при синхронизации,
когда ячейка памяти читается дважды, оба раза
прочитано одинаковое значение, и признак
«значение одинаковое» трактуется как «ничего
не менялось». Однако, другой поток может
выполниться между этими двумя чтениями,
поменять значение, сделать что-нибудь ещё, и
восстановить старое значение. Таким образом,
первый поток обманется, считая, что не
поменялось ничего, хотя второй поток уже
разрушил это предположение. (Википедия)
• Обычно решается вместе с проблемой времени
жизни
“Не замки” (Lock free programming).
ABA проблема
• Максимальный размер аргумента – слово
• Узловая структура ведет к худшей локальности
данных (промахи кэша)
• В некоторых структурах слишком большое
число атомарных операций - плохая
производительность
• Итеративное расширение фунциональности
практически невозможно.
“Не замки” (Lock free programming).
Другие ограничения/проблемы.
Борьба за память (Contention)
• Возникает при постоянных попытках чтения/записи разными
потоками одного участка памяти
• Большой трафик в системе кэшей
• Замедление работы всей системы
T pop(){
node* old_head_value = head.load();
while (!head.compare_exchange_weak(
old_head_value, old_head_value->next)
);
…
}
T pop(){
node* old_head_value = head.load();
while (!head.compare_exchange_weak(
old_head_value, old_head_value->next)
);
…
}
• Когерентность кэша (англ. cache coherence) — свойство кэшей,
означающее целостность данных, хранящихся в локальных кэшах
для разделяемого ресурса. (Википедия)
Борьба за память (Contention).
Способы решения
• Длительность паузы растет экспоненциально.
T pop(){
atomic_backoff backoff;
node* old_head_value = head.load();
while (!head.compare_exchange_weak(old_head_value,
old_head_value->next))
{
backoff.pause();
};
…
}
Меньше гарантий – Больше
производительности ?
Стек. Предельный случай.
5 8
9
7 1
A::push(5)
B::push(7)
C::pop()
D::pop()
Крадем
старейщий
элемент у
случайного
соседа
Правильно выбирайте контейнер
• Разные требования – разные решения
• Нет универсального решения
• Бесплатный сыр ...
• Параметры:
– Single/Multiple Producer – Single/Multiple
Consumer
– Возможность удаления элементов
– Гарантии безопасности при «исключениях»
– Value based / Reference based
– Эффективность серийного использования

Más contenido relacionado

La actualidad más candente

C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью. Unguryan Vitaliy
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.Igor Shkulipa
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версийUnguryan Vitaliy
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.Igor Shkulipa
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture libraryMERA_school
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Dima Dzuba
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыUnguryan Vitaliy
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 

La actualidad más candente (20)

C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
An internal look at HotSpot JVM
An internal look at HotSpot JVMAn internal look at HotSpot JVM
An internal look at HotSpot JVM
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
9. java lecture library
9. java lecture library9. java lecture library
9. java lecture library
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 

Similar a Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?

Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Ontico
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыPositive Development User Group
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Alexander Syrotenko
 
Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)Dmitry Tsitelov
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБДRoman Brovko
 
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)Ontico
 
Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008Ontico
 
Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008Ontico
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Dmitry Tsitelov
 
Msu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing JavaMsu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing Javaolegol
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAlexey Fyodorov
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Ontico
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...it-people
 

Similar a Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь? (20)

Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)
 
11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД11 - Web-технологии. Работа с СУБД
11 - Web-технологии. Работа с СУБД
 
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
 
Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008
 
Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)
 
Msu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing JavaMsu.Center.Lectures.J01 Introducing Java
Msu.Center.Lectures.J01 Introducing Java
 
Lab5
Lab5Lab5
Lab5
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Presentation_1369080393540
Presentation_1369080393540Presentation_1369080393540
Presentation_1369080393540
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Atomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithmsAtomics, CAS and Nonblocking algorithms
Atomics, CAS and Nonblocking algorithms
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
 

Más de Yandex

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

Más de Yandex (20)

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

Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?

  • 1. Контейнеры и многороточность. Вместе или врозь? Антон Потапов, Intel Corporation, Нижний новгород, 2014
  • 2. STL • Контейнеры в С++ = STL • Обще-принятый стандарт • Интерфейс STL - Модель для подражания других библиотек
  • 3. STL. Некоторые важные принципы. • Декомпозиция. Один метод – одна задача. • Гарантии безопасности при «исключениях» • Адаптеры (stack, queue, priority_queue) • Итераторы
  • 4. STL. std::stack. template<typename _Tp, typename _Sequence = deque<_Tp> > class stack { _Sequence c; public: typedef typename _Sequence::value_type value_type; bool empty() const {return c.size();} value_type& top() {return c.back();} void pop() {return c.pop_back();} void push(const value_type& x) {c.push_back(x);} … }; std::stack<non_pod> stack; … if (!stack.empty()){ non_pod e = stack.top(); stack.pop(); … }
  • 5. Гарантии потоко безопасности STL в С++11 • Без дополнительной синхронизации, С++11 позволяет вызывать паралельно только не модифицирующие (const) методы STL контейнеров 17.6.5.9 Data race avoidance (in C++ standard library) [res.on.data.races] ...... 2. A C++ standard library function shall not directly or indirectly access objects (1.10) accessible by threads other than the current thread unless the objects are accessed directly or indirectly via the function’s arguments, including this. 3. A C++ standard library function shall not directly or indirectly modify objects (1.10) accessible by threads other than the current thread unless the objects are accessed directly or indirectly via the function’s non-const arguments, including this.
  • 6. STL. std::concurrent_stack ? template<typename _Tp, typename _Sequence = deque<_Tp> > class stack { _Sequence c; mutex mtx; public: bool empty() const { lock_guard g(mtx); return c.size(); } … }; std::stack<non_pod> stack; … if (!stack.empty()){ non_pod e = stack.top(); stack.pop(); … }
  • 7. Конкурентное использование STL. std::stack<non_pod> stack; mutex mtx; … { lock_guard g(mtx); if (!stack.empty()){ non_pod e = stack.top(); stack.pop(); … } } std::stack Итерирование std::map<int, non_pod> map; typedef std::map<int, non_pod>::iterator it_t; mutex mtx; … { lock_guard g(mtx); for(it_t it = map.begin(); it != map.end(); ++it) { calc((*it).second); } } • Необходима внешняя (по отношению к STL контейнеру) синхронизация! • Невозможно добавить потокобезопасность как итеративную надстройку над серийным контейнером.
  • 8. Конкурентное использование STL. Выводы • STL это эффективные _серийные_ контейнеры.
  • 9. Value based VS reference based • reference based (STL – яркий пример) – Плюсы: • Эффективность (отсутствие ненужных копирований) • Высокие гарантии потокобезопасности – Минусы: • 3 метода вместо одного • Время жизни обьектов контейнера • Value based – Все с точностью до наооборот
  • 10. Value based VS Reference based std::stack<non_pod> stack; mutex mtx; … { lock_guard g(mtx); if (!stack.empty()){ non_pod e = stack.top(); stack.pop(); … } } concurrent_stack<non_pod> stack; … { non_pod t; if (!stack.try_pop(t)){ calc(t); … } }
  • 11. «Транзакционный» интерфейс ? • try_pop() • pop_if_not_empty() • delete_if_present() • …. • Транзакционная память ?
  • 12. Замки и «не замки» (Locks and lock free) – немного теории
  • 13. Замки. Частые проблемы. • Взаи́мная блокиро́вка • Голодание • Инверсия приоритетов
  • 14. Взаимная блокировка • Взаи́мная блокиро́вка (англ. deadlock) — ситуация в многозадачной среде или СУБД, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами. (Википедия)
  • 15. Взаимная блокировка. Методы решения. • Иерархии замков • Захват всех необходимых замков одним вызовом • Упорядочивание замков (например по адресу)
  • 16. Взаимная блокировка. Стек template< typename T > class stack { class node{ node* next; T data; node(const T& t) :data(t) {} }; node* head; mutex mtx; … }; void push(const T& t){ lock_guard lck(mtx); node * p_node = new node(t); p_node->next = head; head = p_node; } Нельзя звать «чужой» код под замком !
  • 17. Взаимная блокировка. Правильный вариант стека template< typename T > class stack { class node{ node* next; T data; node(const T& t) :data(t) {} }; node* head; mutex mtx; … }; void push(const T& t){ node * p_node = new node(t); lock_guard lck(mtx); p_node->next = head; head = p_node; } };
  • 18. Замки. Стек. Гарантии при работе с исключениями. template< typename T > class stack { class node{ node* next; T data; node(const T& t) :data(t) {} }; node* head; mutex mtx; … }; T pop(){ node * p_node; { lock_guard lck(mtx); p_node = head; head = head->next; } std::auto_ptr<node> p(p_node); return p_node->data; } };
  • 19. «Не замки» (lock free) – немного теории
  • 20. “Не замки” (Lock free programming). Зачем это надо • Не использутся блокировки – нет связанных с ними проблем • Гарантия прогресса всей системы в целом, даже в случае краха одного из потоков • Обычно способствует увеличению производительсности
  • 21. “Не замки” (Lock free programming). CAS • Сравнение с обменом (англ. compare and set, compare and swap, CAS) — атомарная инструкция, сравнивающая значение в памяти с одним из аргументов, и в случае успеха записывающая второй аргумент в память. (Википедия) • [atomics.types.operations.req]: template<typename T> bool atomic<T>::compare_exchange_weak(T& expected, T desired, memory_order m = memory_order_seq_cst) noexcept; – expected – “старое”, ожидаемое значение атомарной переменной – desired – новое значение, которое хотим записать – Эффект: Сравнивает содержимое памяти по адресам this и &expected, и, в случае равенства, записывает содержимое desired в *this. В случае не равенства, записывает содержимое *this в в expected. Сравнение и запись происходят, атомарно, как одна интсрукция. – Returns: Результат сравнения.
  • 22. “Не замки” (Lock free programming). Stack template<typename T> class lock_free_stack { class node{ node* next; T data; node(const T& t): data(t) {} }; atomic<node*> head; public: lock_free_stack(){ head.store(NULL);} void push(const T& t){ node * p_node = new node(t); node* old_head_value = head.load(); do { p_node->next = old_head_value; } while (!head.compare_exchange_weak(old_head_value, p_node)); } };
  • 23. “Не замки” (Lock free programming). Stack template<typename T> class lock_free_stack { class node{ node* next; T data; node(const T& t): data(t) {} }; atomic<node*> head; public: lock_free_stack(){ head.store(NULL);} … T pop(){ node* old_head_value = head.load(); while (!head.compare_exchange_weak(old_head_value, old_head_value.next)); T tmp = old_head_value.data; delete old_head_value; return tmp; } }; Ууупс 
  • 24. “Не замки” (Lock free programming). Время жизни. T pop(){ node* old_head_value = head.load(); while (!head.compare_exchange_weak( old_head_value, old_head_value->next) ); T tmp = old_head_value.data; delete old_head_value; return tmp; } template<typename T> class lock_free_stack { class node{ node* next; T data; node(const T& t): data(t) {} }; atomic<node*> head; public: lock_free_stack(){ head.store(NULL);} … }; T pop(){ node* old_head_value = head.load(); while (!head.compare_exchange_weak( old_head_value, old_head_value->next) ); T tmp = old_head_value.data; delete old_head_value; return tmp; }
  • 25. • Не удалять а переиспользовать обьекты • Счетчик ссылок (внешний) • Сборщик мусора • Safe Memory Reclamation schemes – Hazard Pointers – Pass the Buck “Не замки” (Lock free programming). Время жизни обьектов. Способы решения
  • 26. • проблема ABA возникает при синхронизации, когда ячейка памяти читается дважды, оба раза прочитано одинаковое значение, и признак «значение одинаковое» трактуется как «ничего не менялось». Однако, другой поток может выполниться между этими двумя чтениями, поменять значение, сделать что-нибудь ещё, и восстановить старое значение. Таким образом, первый поток обманется, считая, что не поменялось ничего, хотя второй поток уже разрушил это предположение. (Википедия) • Обычно решается вместе с проблемой времени жизни “Не замки” (Lock free programming). ABA проблема
  • 27. • Максимальный размер аргумента – слово • Узловая структура ведет к худшей локальности данных (промахи кэша) • В некоторых структурах слишком большое число атомарных операций - плохая производительность • Итеративное расширение фунциональности практически невозможно. “Не замки” (Lock free programming). Другие ограничения/проблемы.
  • 28. Борьба за память (Contention) • Возникает при постоянных попытках чтения/записи разными потоками одного участка памяти • Большой трафик в системе кэшей • Замедление работы всей системы T pop(){ node* old_head_value = head.load(); while (!head.compare_exchange_weak( old_head_value, old_head_value->next) ); … } T pop(){ node* old_head_value = head.load(); while (!head.compare_exchange_weak( old_head_value, old_head_value->next) ); … } • Когерентность кэша (англ. cache coherence) — свойство кэшей, означающее целостность данных, хранящихся в локальных кэшах для разделяемого ресурса. (Википедия)
  • 29. Борьба за память (Contention). Способы решения • Длительность паузы растет экспоненциально. T pop(){ atomic_backoff backoff; node* old_head_value = head.load(); while (!head.compare_exchange_weak(old_head_value, old_head_value->next)) { backoff.pause(); }; … }
  • 30. Меньше гарантий – Больше производительности ? Стек. Предельный случай. 5 8 9 7 1 A::push(5) B::push(7) C::pop() D::pop() Крадем старейщий элемент у случайного соседа
  • 31. Правильно выбирайте контейнер • Разные требования – разные решения • Нет универсального решения • Бесплатный сыр ... • Параметры: – Single/Multiple Producer – Single/Multiple Consumer – Возможность удаления элементов – Гарантии безопасности при «исключениях» – Value based / Reference based – Эффективность серийного использования