Click here to Skip to main content
13,862,201 members
Click here to Skip to main content
Add your own
alternative version

Tagged as


27 bookmarked
Posted 22 May 2012
Licenced CPOL

The Unsung Hero, Volatile Keyword: - C# Threading

, 23 May 2012
Rate this:
Please Sign up or sign in to vote.
The unsung hero, Volatile keyword: - C# threading

My Mad and Blind Love with C# Threading

When I first saw C# threading code, I just fell in love forever. As days passed by, the power and simplicity of “System.Threading” namespace converted my love into blind love.

Thread t1 = new Thread(SomeThread);

In case you have still not fallen in love and are new to C# threading, you can start looking at my C# training threading video.

The blind love was but obvious because in today’s modern world, parallel task execution is a compulsory component. My love helped me to please users with mind blowing UI interfaces, multi-threaded batch processes, until one day…..

End of Blind Love with C# Threads


But one fine day, my love with C# threads had a bump. I had two threads running and both were updating the same local variable. The updation done by one thread was not visible to the other thread.

Let me detail what I am saying. I had created a local variable called as “_loop” as shown in the below abstract code snippet. This variable was set to ‘true’ by default.

class Program
bool _loop = true;

In the same application, I had created one function called as “SomeThread” which will run until the “_loop” is true.

private static void SomeThread(object o1)
while (o._loop)

From the main thread, I was spawning some thread which was running the loop continuously. In this main thread, I was setting the “_loop” to false. In other words, the infinite loop of “SomeThread” should stop and exit…VOILA, it did not.

static void Main(string[] args)
Thread t1 = new Thread(SomeThread);
o1._loop = false;

Below is the complete source code, you download and see it for yourself.

bool _loop = true; 
static void Main(string[] args)
            Program o1 = new Program();
            Thread t1 = new Thread(SomeThread);
            o1._loop = false;
            Console.WriteLine("Value Set to false");
        private static void SomeThread(object o1)
            Program o = (Program)o1;
            Console.WriteLine("Loop Starting...");
            while (o._loop)
            Console.WriteLine("Loop Stopping...");

If you run the above code, you can see the infinite loop starting, but it does not end even if the value was set to “false”.

You can also see the actual video demo of the code by clicking on C# training for threading.

Note: When you run the code, ensure that you have selected release with CNTRL + F5 pressed.

Why Did My Love Ditch Me: Local Thread Memory Storage and Synchronization

After so many years of successful relationship, it was difficult to believe this unexpected behavior. So I started Googling to get reasons for it.

After long hours of reading, I was stunned that there are two kinds of memory we have to deal with when it comes to threading.

One is the main memory where our variables are allocated and the thread also has his own local memory…SURPRISED, same here.

In other words the “_loop” is present at three places, one in the main memory and second in the local memories of “mainthread” and “somethread” functions.

When the program kick starts, the “_loop” is set to true. So all the memory storages have “_loop” set to true. See the below visual representation.

As the program runs the main thread set the value to false. This updation is done in the local memory of “mainthread” and main the memory, but it does not update the local memory of “SomeThread”. So the “SomeThread” function still sees the stale value and keeps running in a loop.

Below is a visual representation of how things look internally at various points.

The Unsung Hero: Volatile Keyword

All relationships have problems, we just need to adjust, find a solution and move with life. I was definitely in no mood of leaving C# threading after such a wonderful relationship.

The solution to get around this multiple memory storages was the “VOLATILE” keyword.

If you declare your variable as volatile, the thread tries to access values from main memory rather than from his local memory where data is stale. It does slow down a bit but it addresses this big confusion.

See it yourself, take the same source code and change the “_loop” variable to volatile as shown in the below code snippet and run it.

class Program
  volatile bool _loop = true; 

Ensure that you select mode “release” and hit control + F5 to see the expected behavior.

Feel and See It Yourself

In case you want to see live what I have said in this blog, see the video below:

You can also see it yourself by downloading the code.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

You may also be interested in...

Comments and Discussions

PraiseMy vote of 5 Pin
Yogesh Desai21-Nov-15 4:16
memberYogesh Desai21-Nov-15 4:16 
QuestionMy Vote of 5 Pin
Gerry198320-May-15 1:50
memberGerry198320-May-15 1:50 
QuestionWithout volatile also I am achieving results Pin
Member 1119224026-Jan-15 15:22
memberMember 1119224026-Jan-15 15:22 
GeneralNice article and great discussions Pin
Shanadas27-Nov-14 1:30
memberShanadas27-Nov-14 1:30 
GeneralMy vote of 5 Pin
Abhishek Shrotriya31-Oct-14 23:09
memberAbhishek Shrotriya31-Oct-14 23:09 
GeneralMy vote of 1 Pin
hungndv23-Sep-14 20:50
memberhungndv23-Sep-14 20:50 
QuestionRegarding Release Mode Pin
Member 1065313122-Sep-14 7:16
memberMember 1065313122-Sep-14 7:16 
Questionresult is different than yours Pin
tomar virender9-May-14 3:00
membertomar virender9-May-14 3:00 
GeneralMy vote of 5 Pin
Phani K28-Mar-14 0:00
memberPhani K28-Mar-14 0:00 
GeneralMy Vote for 5 Pin
Rajneesh Rai10-Dec-13 2:32
memberRajneesh Rai10-Dec-13 2:32 
GeneralMy vote of 5 Pin
Abhishek_Kashyap8-May-13 3:21
memberAbhishek_Kashyap8-May-13 3:21 
GeneralMy vote of 1 Pin
Member 63815-Apr-13 17:00
memberMember 63815-Apr-13 17:00 
GeneralMy vote of 1 Pin
Matty224-Apr-13 16:37
memberMatty224-Apr-13 16:37 
QuestionNot working Pin
Member 879811415-Oct-12 18:31
memberMember 879811415-Oct-12 18:31 
GeneralMy vote of 2 Pin
Björn Friedrich30-Jun-12 5:49
memberBjörn Friedrich30-Jun-12 5:49 
GeneralMy vote of 2 Pin
johannesnestler30-May-12 22:12
memberjohannesnestler30-May-12 22:12 
QuestionVideo capture Pin
Anand K Reddy27-May-12 21:49
memberAnand K Reddy27-May-12 21:49 
GeneralMy vote of 5 Pin
surajfrommumbai24-May-12 6:30
membersurajfrommumbai24-May-12 6:30 
GeneralMy vote of 1 PinPopular
Leonardo Paneque24-May-12 4:49
memberLeonardo Paneque24-May-12 4:49 
GeneralRe: My vote of 1 Pin
Shivprasad koirala24-May-12 6:27
memberShivprasad koirala24-May-12 6:27 
GeneralRe: My vote of 1 PinPopular
Leonardo Paneque24-May-12 6:55
memberLeonardo Paneque24-May-12 6:55 
GeneralRe: My vote of 1 Pin
Shivprasad koirala24-May-12 16:20
memberShivprasad koirala24-May-12 16:20 
GeneralRe: My vote of 1 Pin
Leonardo Paneque25-May-12 5:37
memberLeonardo Paneque25-May-12 5:37 
GeneralRe: My vote of 1 Pin
Theraot24-Oct-12 21:07
memberTheraot24-Oct-12 21:07 
GeneralRe: My vote of 1 Pin
oggenok24-May-12 20:00
memberoggenok24-May-12 20:00 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web02 | 2.8.190214.1 | Last Updated 23 May 2012
Article Copyright 2012 by Shivprasad koirala
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid