Today's summary is about a paper written by John Ousterhout in 1995. This is technically not a paper, but a presentation given by the author at a Usenix conference.
Threads are independent execution streams that shared state (memory) and are often preemptively scheduled by the OS/runtime.
Threads are too hard for most programmers because:
Synchronization: access to shared data must be coordinated with locks.
Deadlock: Circular dependencies among locks.
Hard to debug: data dependencies, timing dependencies.