Previously, both ends were set to non-blocking I/O. Now, only the reader is set non-blocking. This means the writer will block for a while if the pipe fills, but since the watcher is in a different thread from the reader, the pipe will eventually drain, and the writer can continue. This is really nothing more than a lock, just not a mutex-type lock.