Алексей	
  Федоров,	
  
Одноклассники	
  / JUG.ru
Атомики,  CAS  и  неблокирующие  алгоритмы
Зачем	
  вы	
  здесь?
3
4
Модели
• Модель	
  с	
  разделяемой	
  памятью
- Регистры
- Операции:	
  read,	
  write
- Удобно	
  программировать,	
  все	
  привыкли
• Модель	
  с	
  передачей	
  сообщений
- Послать	
  сообщение
- Похожа	
  на	
  то,	
  как	
  реально	
  работает	
  железо
5
Терминология
• Нет	
  устоявшейся	
  терминологии
• Термины:
• Parallel
- Concurrent
- Distributed
6
Виды  параллелизма
• На	
  уровне	
  операционной	
  системы
• На	
  уровне	
  одной	
  программы	
  /	
  процесса
7
Параллелизм  — ОС
• Слушать	
  музыку	
  и	
  переписываться	
  в	
  фейсбуке в	
  Одноклассниках
• При	
  зависании	
  одной	
  программы	
  другие	
  продолжают	
  работать
• и	
  т.п.
8
Преимущества  параллелизма
• Использование	
  нескольких	
  ядер/процессоров
- Да	
  и	
  на	
  1	
  ядре	
  тоже!	
  (async I/O)
• Простота	
  моделирования
- Абстракция:	
  фреймворкзабирает	
  сложность
• Упрощенная	
  обработка	
  асинхронных	
  событий
• Более	
  отзывчивые	
  интерфейсы	
  пользователя
- Event	
  Dispatch	
  Thread	
  (EDT),	
  async calls
9
Параллелизм  на  уровне  отдельно  взятой  программы
• Эффективное	
  использование	
  ресурсов
• Удобство,	
  простота	
  написания	
  кода
• Справедливость	
  
- Обработка	
  запросов	
  пользователей	
  на	
  серверах	
  соцсети с	
  
одинаковым	
  приоритетом
- Читатели	
  и	
  писатели
- Fairness	
  (честность)
10
Lock lock = new ReentrantLock(true);
11
Честность!
Lock lock = new ReentrantLock(true);
12
Блокировки
• java.util.concurrent — since  Java  5
- Lock  —>  ReentrantLock
- ReadWriteLock —>  ReentrantReadWriteLock
- StampedLock — since  Java  8
• Synchronized  method  /  section
• wait()  /  notify()  /  notifyAll()
13
Блокировки
• java.util.concurrent — since  Java  5
- Lock  —>  ReentrantLock
- ReadWriteLock —>  ReentrantReadWriteLock
- StampedLock — since  Java  8
• Synchronized  method  /  section
• wait()  /  notify()  /  notifyAll()
Общее: ожидание
14
Проблемы  блокировок
• Взаимоблокировки	
  (Deadlocks)
• Инверсия	
  приоритетов
• Надежность	
  — вдруг	
  владелец	
  блокировки	
  помрет?
• Performance
- Параллелизма	
  в	
  критической	
  секции	
  нет!
- Владелец	
  блокировки	
  может	
  быть	
  вытеснен	
  
планировщиком
15
Закон  Амдала
• α — часть	
  общего	
  объема	
  вычислений,	
  
которую	
  нельзя	
  распараллелить	
  
• 1-α — часть,	
  которую	
  можно	
  распараллелить
• p — количество	
  потоков
16
Закон  Амдала
• α — часть	
  общего	
  объема	
  вычислений,	
  
которую	
  нельзя	
  распараллелить	
  
• 1-α — часть,	
  которую	
  можно	
  распараллелить
• p — количество	
  потоков
Неблокирующие	
  алгоритмы
18
Классификация
• Без	
  препятствий	
  (Obstruction-­‐Free)	
  — поток	
  совершает	
  прогресс,	
  
если	
  не	
  встречает	
  препятствий	
  со	
  стороны	
  других	
  потоков
• Без	
  блокировок	
  (Lock-­‐Free) — гарантируется	
  системный	
  прогресс	
  
хотя	
  бы	
  одного	
  потока
• Без	
  ожидания (Wait-­‐Free) — каждая	
  операция	
  выполняется	
  за	
  
фиксированное	
  число	
  шагов,	
  не	
  зависящее	
  от	
  других	
  потоков
19
Консенсус
• Объект	
  consensus	
  с	
  операцией	
  decide(v):
- consensus.decide(v)	
  ≠	
  const
- wait-­‐free
• N	
  Потоков	
  вызывают	
  consensus.decide()
- i-­‐ый поток	
  вызывает	
  consensus.decide(vi)
- Каждый	
  поток	
  вызывает	
  не	
  более	
  1	
  раза
- decide() возвращает	
  одно	
  из	
  vi
• decide()	
  — протокол	
  консенсуса
20
Консенсусное число
• Мощность	
  консенсуса	
  — максимальное	
  количество	
  (N) потоков,	
  
для	
  которых	
  данный	
  объект	
  обеспечивает	
  консенсус
• Консенсусное число	
  примитива	
  синхронизации	
  —максимальная	
  
мощность	
  консенсуса,	
  который	
  можно	
  построить	
  на	
  базе	
  данного	
  
примитива и	
  некоторого	
  количества	
  атомарных	
  регистров
- То	
  есть,	
  существует	
  реализация	
  метода	
  decide	
  для	
  N	
  потоков,	
  
использующая	
  данный	
  примитив	
  как	
  строительный	
  блок
21
Консенсусные числа  различных  операций
• Операции	
  на	
  регистрах	
  — 1
• Read-­‐Modification-­‐Write	
  (RMW)— 2
- Common2	
  Class — коммутируют	
  друг	
  с	
  другом	
  или	
  
перезаписывают	
  друг	
  друга
- Универсальные	
  операции	
  — ∞
- Сравнение	
  с	
  обменом	
  (CAS):	
  
Compare-­‐And-­‐Swap,	
  Compare-­‐And-­‐Set
22
Compare  and  Swap
• Compare-­‐and-­‐swap  (CAS)
- IA32,  x64  
- SPARC
• load-­‐linked  /  store-­‐conditional  (LL/SC)
- PowerPC
- ARM
23
Семантика  CAS
24
CAS  Loop  — типичный  паттерн  применения
1. Прочитать	
  значение	
  A	
  из	
  переменной	
  V
2. Взять	
  какое-­‐то	
  новое	
  значение	
  B	
  для	
  V
3. Использовать	
  CAS	
  для	
  атомарного	
  изменения	
  V	
  из	
  A	
  в	
  B до	
  тех	
  
пор,	
  пока	
  другие	
  потоки	
  меняют	
  значение	
  V	
  во	
  время	
  этого	
  
процесса
Атомарность Read-­‐Modify-­‐Write	
  реализуется	
  за	
  счет	
  постоянного	
  
мониторинга системы	
  на	
  предмет	
  постороннего	
  вмешательства
25
Пример:  неблокирующий  счетчик
26
Fast  vs.  slow  path
• Каждый	
  блок	
  кода	
  может	
  иметь,	
  как	
  минимум,	
  
два	
  пути	
  исполнения:	
  короткий	
  и	
  длинный
• Lock:	
  contended	
  vs.	
  Uncontended
• Uncontended	
  Lock:
- ≥	
  1	
  CAS
27
Недостатки  CAS
• CAS	
  заставляет	
  потоки,	
  которые	
  его	
  вызывают,	
  работать	
  в	
  
условиях	
  соревнования	
  (contention)
- Больше	
  contention	
  =	
  больше	
  бесполезных	
  циклов	
  
процессора,	
  трата	
  процессорного	
  времени
• Написание	
  корректных	
  и	
  быстрых	
  алгоритмов	
  на	
  	
  CAS	
  требует	
  
специальной	
  подготовки
Поддержка	
  в	
  Java
29
Поддержка  CAS  в  Java
• В	
  Java	
  5	
  появился	
  JSR166
- пакет	
  java.util.concurrent
- пакет	
  java.util.concurrent.atomic
• На	
  платформах,	
  поддерживающих	
  CAS,	
  JIT-­‐компилятор	
  делает	
  
inline	
  соответствующих	
  машинных	
  инструкций
• Load	
  Linked	
  /	
  Store	
  Conditional	
  
30
Atomic  variable  classes
• Scalars
• Field  updaters
• Arrays
• Compound  variables
• Accumulators
- since  Java  8
31
Scalars
• AtomicBoolean
• AtomicInteger
• AtomicLong
• AtomicReference
32
AtomicLong
• boolean compareAndSet(int expect,  int update)
• long  addAndGet(int delta)
• long getAndAdd(int delta)
• long  getAndDecrement()
• long  getAndIncrement()
• long  incrementAndGet()
• …
33
AtomicLong
• boolean compareAndSet(int expect,  int update)
• long  addAndGet(int delta)
• long getAndAdd(int delta)
• long  getAndDecrement()
• long  getAndIncrement()
• long  incrementAndGet()
• …
34
35
atomicLong.getAndAdd(5)
loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add        $0x5,%r11
lock  cmpxchg  %r11,0x10(%rbx)
sete      %r11b
movzbl  %r11b,%r11d
test %r10d,%r10d
je          loop
JDK	
  7u80	
  	
  	
  	
  -­‐XX:+PrintAssembly
36
atomicLong.getAndAdd(5)
lock  addq $0x5,0x10(%rbp))loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add        $0x5,%r11
lock  cmpxchg  %r11,0x10(%rbx)
sete      %r11b
movzbl  %r11b,%r11d
test %r10d,%r10d
je          loop
JDK	
  7u80	
  	
  	
  	
  -­‐XX:+PrintAssembly JDK	
  8u60	
   -­‐XX:+PrintAssembly
37
atomicLong.getAndAdd(5)
lock  addq $0x5,0x10(%rbp))loop:
mov 0x10(%rbx),%rax
mov %rax,%r11
add        $0x5,%r11
lock  cmpxchg  %r11,0x10(%rbx)
sete      %r11b
movzbl  %r11b,%r11d
test %r10d,%r10d
je          loop
JDK	
  7u80	
  	
  	
  	
  -­‐XX:+PrintAssembly JDK	
  8u60	
   -­‐XX:+PrintAssembly
83
46
15 11
132
105
45 43
1 2 3 4
ops	
  /	
  μs
threads
38
39
Multivariable  Invariant
40
Multivariable  Invariant
41
Field  Updaters
• AtomicIntegerFieldUpdater
- Reflection-­‐based	
  updater	
  for	
  volatile	
  int
• AtomicLongFieldUpdater
- Reflection-­‐based	
  updater	
  for	
  volatile	
  long
• AtomicReferenceFieldUpdater
- Reflection-­‐based	
  updater	
  for	
  volatile	
  object
42
AtomicLongFieldUpdater
long  addAndGet(T  obj,  long  delta)
boolean compareAndSet(T  obj,  long  exp, long  upd)
long  getAndAdd(T  obj,  long  delta)
long  incrementAndGet(T  obj)
Demo.	
  Legacy	
  Volatile	
  Counter
44
AtomicLongFieldUpdater
45
AtomicLongFieldUpdater
46
AtomicArrays
• AtomicIntegerArray
• AtomicLongArray
• AtomicReferenceArray
47
AtomicLongArray
• long  addAndGet(int i,  long  delta)
• long  getAndAdd(int i,  long  delta)
• boolean compareAndSet(int i,  long  exp,  long  upd)
• long  incrementAndGet(int i)
• …
48
Compound  Variables
AtomicMarkableReference
V  compareAndSet(
V  expectedRef,  V  newRef,  boolean expectedMark,  boolean newMark)
AtomicStampedReference
boolean compareAndSet(
V  expectedRef,  V  newRef,  int expectedStamp,  int newStamp)
49
Accumulators
• DoubleAccumulator
• DoubleAdder
• LongAccumulator
• LongAdder
• (Striped64)
50
LongAccumulator
• void  accumulate(long  x)
• long  get()
• long  getThenReset()
• Void  reset()
51
• Алгоритм	
  называется	
  неблокирующим	
  (nonblocking),	
  если	
  отказ	
  или	
  
остановка	
  любого	
  потока	
  не	
  может	
  привести	
  к	
  отказу	
  или	
  остановке	
  
любого	
  другого	
  потока
• Алгоритм	
  называется	
  свободным	
  от	
  блокировок (lock-­‐free),	
  если	
  на	
  
каждом	
  шаге	
  какой-­‐то	
  поток	
  выполняет	
  работу	
  (make	
  progress)
51
Неблокирующие  алгоритмы
52
• Алгоритм	
  называется	
  неблокирующим	
  (nonblocking),	
  если	
  отказ	
  или	
  
остановка	
  любого	
  потока	
  не	
  может	
  привести	
  к	
  отказу	
  или	
  остановке	
  
любого	
  другого	
  потока
• Алгоритм	
  называется	
  свободным	
  от	
  блокировок (lock-­‐free),	
  если	
  на	
  
каждом	
  шаге	
  какой-­‐то	
  поток	
  выполняет	
  работу	
  (make	
  progress)
• nonblockingи	
  lock-­‐free	
  — это	
  разные	
  вещи!
- Алгоритмы	
  на	
  CAS	
  могут быть	
  одновременно	
  неблокирующими	
  и	
  
свободными	
  от	
  блокировок	
  
52
Неблокирующие  алгоритмы
53
Неблокирующий  стек
54
Неблокирующий  стек
55
Неблокирующий  стек
56
Неблокирующая  очередь
• Michael	
  and	
  Scott,	
  1996
• Потоки	
  помогают друг	
  другу
Литература
58
59
60
61
DL  и  все-­все-­все
http://altair.cs.oswego.edu/mailman/listinfo/concurrency-­‐interest
To	
  post	
  a	
  message	
  to	
  all	
  the	
  list	
  members,	
  send	
  email to
concurrency-­‐interest@cs.oswego.edu
62
Много	
  полезных	
  видео
63
https://bitbucket.org/23derevo/concurrency
Вопросы	
  и	
  ответы
Спасибо	
  за	
  внимание!
@23derevo
alexey@jugru.org
alexey.fyodorov@corp.mail.ru

Nonblocking algorithms/CAS/Atomics by Alexey Fyodorov

  • 1.
    Алексей  Федоров,   Одноклассники  / JUG.ru Атомики,  CAS  и  неблокирующие  алгоритмы
  • 2.
  • 3.
  • 4.
    4 Модели • Модель  с  разделяемой  памятью - Регистры - Операции:  read,  write - Удобно  программировать,  все  привыкли • Модель  с  передачей  сообщений - Послать  сообщение - Похожа  на  то,  как  реально  работает  железо
  • 5.
    5 Терминология • Нет  устоявшейся  терминологии • Термины: • Parallel - Concurrent - Distributed
  • 6.
    6 Виды  параллелизма • На  уровне  операционной  системы • На  уровне  одной  программы  /  процесса
  • 7.
    7 Параллелизм  — ОС •Слушать  музыку  и  переписываться  в  фейсбуке в  Одноклассниках • При  зависании  одной  программы  другие  продолжают  работать • и  т.п.
  • 8.
    8 Преимущества  параллелизма • Использование  нескольких  ядер/процессоров - Да  и  на  1  ядре  тоже!  (async I/O) • Простота  моделирования - Абстракция:  фреймворкзабирает  сложность • Упрощенная  обработка  асинхронных  событий • Более  отзывчивые  интерфейсы  пользователя - Event  Dispatch  Thread  (EDT),  async calls
  • 9.
    9 Параллелизм  на  уровне отдельно  взятой  программы • Эффективное  использование  ресурсов • Удобство,  простота  написания  кода • Справедливость   - Обработка  запросов  пользователей  на  серверах  соцсети с   одинаковым  приоритетом - Читатели  и  писатели - Fairness  (честность)
  • 10.
    10 Lock lock =new ReentrantLock(true);
  • 11.
    11 Честность! Lock lock =new ReentrantLock(true);
  • 12.
    12 Блокировки • java.util.concurrent —since  Java  5 - Lock  —>  ReentrantLock - ReadWriteLock —>  ReentrantReadWriteLock - StampedLock — since  Java  8 • Synchronized  method  /  section • wait()  /  notify()  /  notifyAll()
  • 13.
    13 Блокировки • java.util.concurrent —since  Java  5 - Lock  —>  ReentrantLock - ReadWriteLock —>  ReentrantReadWriteLock - StampedLock — since  Java  8 • Synchronized  method  /  section • wait()  /  notify()  /  notifyAll() Общее: ожидание
  • 14.
    14 Проблемы  блокировок • Взаимоблокировки  (Deadlocks) • Инверсия  приоритетов • Надежность  — вдруг  владелец  блокировки  помрет? • Performance - Параллелизма  в  критической  секции  нет! - Владелец  блокировки  может  быть  вытеснен   планировщиком
  • 15.
    15 Закон  Амдала • α— часть  общего  объема  вычислений,   которую  нельзя  распараллелить   • 1-α — часть,  которую  можно  распараллелить • p — количество  потоков
  • 16.
    16 Закон  Амдала • α— часть  общего  объема  вычислений,   которую  нельзя  распараллелить   • 1-α — часть,  которую  можно  распараллелить • p — количество  потоков
  • 17.
  • 18.
    18 Классификация • Без  препятствий  (Obstruction-­‐Free)  — поток  совершает  прогресс,   если  не  встречает  препятствий  со  стороны  других  потоков • Без  блокировок  (Lock-­‐Free) — гарантируется  системный  прогресс   хотя  бы  одного  потока • Без  ожидания (Wait-­‐Free) — каждая  операция  выполняется  за   фиксированное  число  шагов,  не  зависящее  от  других  потоков
  • 19.
    19 Консенсус • Объект  consensus  с  операцией  decide(v): - consensus.decide(v)  ≠  const - wait-­‐free • N  Потоков  вызывают  consensus.decide() - i-­‐ый поток  вызывает  consensus.decide(vi) - Каждый  поток  вызывает  не  более  1  раза - decide() возвращает  одно  из  vi • decide()  — протокол  консенсуса
  • 20.
    20 Консенсусное число • Мощность  консенсуса  — максимальное  количество  (N) потоков,   для  которых  данный  объект  обеспечивает  консенсус • Консенсусное число  примитива  синхронизации  —максимальная   мощность  консенсуса,  который  можно  построить  на  базе  данного   примитива и  некоторого  количества  атомарных  регистров - То  есть,  существует  реализация  метода  decide  для  N  потоков,   использующая  данный  примитив  как  строительный  блок
  • 21.
    21 Консенсусные числа  различных операций • Операции  на  регистрах  — 1 • Read-­‐Modification-­‐Write  (RMW)— 2 - Common2  Class — коммутируют  друг  с  другом  или   перезаписывают  друг  друга - Универсальные  операции  — ∞ - Сравнение  с  обменом  (CAS):   Compare-­‐And-­‐Swap,  Compare-­‐And-­‐Set
  • 22.
    22 Compare  and  Swap •Compare-­‐and-­‐swap  (CAS) - IA32,  x64   - SPARC • load-­‐linked  /  store-­‐conditional  (LL/SC) - PowerPC - ARM
  • 23.
  • 24.
    24 CAS  Loop  —типичный  паттерн  применения 1. Прочитать  значение  A  из  переменной  V 2. Взять  какое-­‐то  новое  значение  B  для  V 3. Использовать  CAS  для  атомарного  изменения  V  из  A  в  B до  тех   пор,  пока  другие  потоки  меняют  значение  V  во  время  этого   процесса Атомарность Read-­‐Modify-­‐Write  реализуется  за  счет  постоянного   мониторинга системы  на  предмет  постороннего  вмешательства
  • 25.
  • 26.
    26 Fast  vs.  slow path • Каждый  блок  кода  может  иметь,  как  минимум,   два  пути  исполнения:  короткий  и  длинный • Lock:  contended  vs.  Uncontended • Uncontended  Lock: - ≥  1  CAS
  • 27.
    27 Недостатки  CAS • CAS  заставляет  потоки,  которые  его  вызывают,  работать  в   условиях  соревнования  (contention) - Больше  contention  =  больше  бесполезных  циклов   процессора,  трата  процессорного  времени • Написание  корректных  и  быстрых  алгоритмов  на    CAS  требует   специальной  подготовки
  • 28.
  • 29.
    29 Поддержка  CAS  в Java • В  Java  5  появился  JSR166 - пакет  java.util.concurrent - пакет  java.util.concurrent.atomic • На  платформах,  поддерживающих  CAS,  JIT-­‐компилятор  делает   inline  соответствующих  машинных  инструкций • Load  Linked  /  Store  Conditional  
  • 30.
    30 Atomic  variable  classes •Scalars • Field  updaters • Arrays • Compound  variables • Accumulators - since  Java  8
  • 31.
  • 32.
    32 AtomicLong • boolean compareAndSet(intexpect,  int update) • long  addAndGet(int delta) • long getAndAdd(int delta) • long  getAndDecrement() • long  getAndIncrement() • long  incrementAndGet() • …
  • 33.
    33 AtomicLong • boolean compareAndSet(intexpect,  int update) • long  addAndGet(int delta) • long getAndAdd(int delta) • long  getAndDecrement() • long  getAndIncrement() • long  incrementAndGet() • …
  • 34.
  • 35.
    35 atomicLong.getAndAdd(5) loop: mov 0x10(%rbx),%rax mov %rax,%r11 add       $0x5,%r11 lock  cmpxchg  %r11,0x10(%rbx) sete      %r11b movzbl  %r11b,%r11d test %r10d,%r10d je          loop JDK  7u80        -­‐XX:+PrintAssembly
  • 36.
    36 atomicLong.getAndAdd(5) lock  addq $0x5,0x10(%rbp))loop: mov0x10(%rbx),%rax mov %rax,%r11 add        $0x5,%r11 lock  cmpxchg  %r11,0x10(%rbx) sete      %r11b movzbl  %r11b,%r11d test %r10d,%r10d je          loop JDK  7u80        -­‐XX:+PrintAssembly JDK  8u60   -­‐XX:+PrintAssembly
  • 37.
    37 atomicLong.getAndAdd(5) lock  addq $0x5,0x10(%rbp))loop: mov0x10(%rbx),%rax mov %rax,%r11 add        $0x5,%r11 lock  cmpxchg  %r11,0x10(%rbx) sete      %r11b movzbl  %r11b,%r11d test %r10d,%r10d je          loop JDK  7u80        -­‐XX:+PrintAssembly JDK  8u60   -­‐XX:+PrintAssembly 83 46 15 11 132 105 45 43 1 2 3 4 ops  /  μs threads
  • 38.
  • 39.
  • 40.
  • 41.
    41 Field  Updaters • AtomicIntegerFieldUpdater -Reflection-­‐based  updater  for  volatile  int • AtomicLongFieldUpdater - Reflection-­‐based  updater  for  volatile  long • AtomicReferenceFieldUpdater - Reflection-­‐based  updater  for  volatile  object
  • 42.
    42 AtomicLongFieldUpdater long  addAndGet(T  obj, long  delta) boolean compareAndSet(T  obj,  long  exp, long  upd) long  getAndAdd(T  obj,  long  delta) long  incrementAndGet(T  obj)
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
    47 AtomicLongArray • long  addAndGet(inti,  long  delta) • long  getAndAdd(int i,  long  delta) • boolean compareAndSet(int i,  long  exp,  long  upd) • long  incrementAndGet(int i) • …
  • 48.
    48 Compound  Variables AtomicMarkableReference V  compareAndSet( V expectedRef,  V  newRef,  boolean expectedMark,  boolean newMark) AtomicStampedReference boolean compareAndSet( V  expectedRef,  V  newRef,  int expectedStamp,  int newStamp)
  • 49.
    49 Accumulators • DoubleAccumulator • DoubleAdder •LongAccumulator • LongAdder • (Striped64)
  • 50.
    50 LongAccumulator • void  accumulate(long x) • long  get() • long  getThenReset() • Void  reset()
  • 51.
    51 • Алгоритм  называется  неблокирующим  (nonblocking),  если  отказ  или   остановка  любого  потока  не  может  привести  к  отказу  или  остановке   любого  другого  потока • Алгоритм  называется  свободным  от  блокировок (lock-­‐free),  если  на   каждом  шаге  какой-­‐то  поток  выполняет  работу  (make  progress) 51 Неблокирующие  алгоритмы
  • 52.
    52 • Алгоритм  называется  неблокирующим  (nonblocking),  если  отказ  или   остановка  любого  потока  не  может  привести  к  отказу  или  остановке   любого  другого  потока • Алгоритм  называется  свободным  от  блокировок (lock-­‐free),  если  на   каждом  шаге  какой-­‐то  поток  выполняет  работу  (make  progress) • nonblockingи  lock-­‐free  — это  разные  вещи! - Алгоритмы  на  CAS  могут быть  одновременно  неблокирующими  и   свободными  от  блокировок   52 Неблокирующие  алгоритмы
  • 53.
  • 54.
  • 55.
  • 56.
    56 Неблокирующая  очередь • Michael  and  Scott,  1996 • Потоки  помогают друг  другу
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
    61 DL  и  все-­все-­все http://altair.cs.oswego.edu/mailman/listinfo/concurrency-­‐interest To  post  a  message  to  all  the  list  members,  send  email to concurrency-­‐interest@cs.oswego.edu
  • 62.
  • 63.
  • 64.
  • 65.