Given any software, there is always a need for sharing resources or passing objects between two or more modules. When two threads are exchanging data as in Figure 1, the "producer" thread puts the resource into a common, shared area (a "shared FIFO buffer"), and the "consumer" thread takes the resource out of the shared area.
However, producer-consumer patterns are often performance bottlenecks. Why? Because one thread has to lock the other one out when both are accessing the shared resource area. This causes the operating system to put one thread on the wait list, while the other accesses the shared area. Of course, when this code becomes an application's hot spot (a common situation), there are alternatives. One approach is to minimize synchronization as much as possible. But no matter how small you make the synchronization functionality, the problem remains and is amplified when the data/resource exchange happens a thousand times a second. Consequently, you should consider using Spin buffers if you are writing high-performance applications because they eliminate the need for synchronization. They don't even need to employ low-level atomic instructions (such as Compare & Swap) found in advanced processors.