This document discusses programming with shared memory in parallel programming. It begins by explaining shared memory multiprocessor systems and how shared memory programming allows data to be accessible by all processors. It then discusses several methods for programming shared memory systems, including using threads and OpenMP. The bulk of the document focuses on explaining OpenMP directives for parallel programming, including how to specify parallel regions, work sharing constructs like for loops and sections, and synchronization methods like barriers and critical sections.