An Introduction to Lock-Free Programming