This document provides an overview of shared memory programming with POSIX threads (Pthreads). It discusses problems that can arise with shared memory programming and introduces techniques for thread synchronization using mutexes, semaphores, barriers, condition variables, and read-write locks. It provides examples of implementing producer-consumer problems, estimating pi in parallel, and building a thread-safe multi-threaded linked list using these synchronization methods. The document is intended to teach parallel programming concepts and the Pthreads API for multi-threaded programming on POSIX systems.