TheDeveloperBlog.com


C# Thread.SpinWait Example

SpinWait. An idle loop uses 100% CPU. It runs for a specified number of iterations in a C# program. With Thread.SpinWait we specify this iteration count. The CPU will max out for the required amount of time for this to complete.


Example. This program uses Thread.SpinWait for one million iterations. It also uses Stopwatch to time how long Thread.SpinWait takes to complete. An argument of 1000000 required about 3 milliseconds to complete on the computer used for testing.

Stopwatch

Note: Because SpinWait actually is computationally intensive, it will complete earlier or later depending on your computer's clock speed.

C# program that uses Thread.SpinWait

using System;
using System.Diagnostics;
using System.Threading;

class Program
{
    static void Main()
    {
	Stopwatch stopwatch = Stopwatch.StartNew();
	// CPU is maxed out during this call.
	// ... (Try making it much larger to test.)
	Thread.SpinWait(1000000);
	Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds);
    }
}

Output

3.0908


Discussion. There is an interesting use for Thread.SpinWait that I have found during testing. Several years ago I did a ThreadPool experiment. I tried to determine how to adjust the number of threads optimally for a multiple-core machine.

And: When I used Thread.Sleep, the experiment did not involve the CPU and so did not yield correct results.

But: When I used Thread.SpinLock, the results were correct. SpinLock is necessary to simulate actual CPU usage.

ThreadPool.SetMinThreads

Summary. We looked at the Thread.SpinWait method found in the System.Threading namespace in the .NET Framework. If you want to waste electricity and make your computer do a lot of wasteful computations, this method is perfect.