C++ Party 2014: Лекция 18. Message passing: многопоточное программирование без мьютексов. Кольцов Степан

733

Кольцов Степан рассказывает о многопоточной синхронизации — mutex и condvar. Объясняет, почему они плохо работают в случае contention. Говорит об альтернативном подходе к многопоточному программированию — передаче сообщений, или message passing. Рассказывает, как устроены мьютексы, почему возникают проблемы и как эффективно реализовать подход message passing.

  1. What’s wrong with mutex?
  2. Hard to write safe code
  3. void first
  4. void foo
  5. Mutexes are expensive
  6. struct spinlock lock = SPINLOCK_INIT
  7. struct spinlock { int locked; }
  8. Code examples github.com/stepancheg/no-mutex-c github.com/stepancheg/no-mutex
  9. struct mutex lock = MUTEX_INIT
  10. struct mutex { int locked; // 1 if locked int count; // number of threads requesting a lock }
  11. Numbers lock cmpxchg 8ns uncont. mutex lock/unlock 11ns futex_wake 400ns cont. mutex lock ~500ns
  12. Hard to parallelize
  13. There’s a solution!
  14. Message passing/ Actor model
  15. class BlockingQueue
  16. Simple message passing with dedicated thread
  17. // non-blocking queue // mutex+condvar BlockingQueue<Request> queue
  18. Actors
  19. interface Runnable { void run(); } ! interface ThreadPoolExecutor { void submit(Runnable); } Executor
  20. abstract class Actor { Actor(Executor executor)
  21. class MyReqProcessor: Actor { MyReqProcessor(Executor exec) { super(exec); }
  22. enum ETaskState { WAITING, RUNNING, RUNNING_GOT_TASKS, }