This document discusses several programming paradigms and concepts related to multi-threaded programming. It covers single process vs multi process vs multi-core/multi-threaded programming. It also discusses processes, threads, synchronization mechanisms like semaphores and barriers, and concurrency issues like deadlock, starvation and livelock that can occur in multi-threaded programs.