Синхронізація потоків

Ми шукаємо баланс між безпекою (сидіти вдома) та життєвістю (кудись поїхати)

  • Lock проста синхронізація
  • Monitor проста синхронізація, безпечна до вилетів
  • Manual reset event усі чекають на одного
  • Auto reset event один за одним, але інші потоки можуть втрутитися
  • Mutex лише один за одним
  • Semaphore кількість потоків, що працюють одночасно





foreground thread - працює до кінця
background thread - працює доки ще є потоки foreground thread, якщо ні - завершує роботу 



Приклади: 
  • Машини на перехресті
  • Літаки що сідають в аеропорті
  • Депозити, що знімаються в банку
  • Читання/запис в той самий файл


Проблеми!

x = x + 1;
  1. Завантажити значення х в регістр
  2. Збільшити значення в регістрі
  3. Записати нове значення в х 
    1. І потоки можуть перемикатися в будь який час між цими операціями
    2. long потребує 2х операцій для читання і запису
    3. Потік може містити копію змінної в своєму кеші (лікує volatile)
    4. Потік може бути вічним
    5. Потоки можуть обмінюватися сигналами
    6. Потоки можуть бути взаємо заблокованими