Jader Dias
Jader Dias

Reputation: 90583

"A reference to a volatile field will not be treated as volatile" implications

The following code

using System.Threading;

class Test
{
    volatile int counter = 0;
    public void Increment()
    {
        Interlocked.Increment(ref counter);
    }
}

Raises the following compiler warning:

"A reference to a volatile field will not be treated as volatile"

Am I doing something wrong here to raise this warning? Why does the compiler me warn about this?

Upvotes: 44

Views: 10359

Answers (4)

Robert Fraser
Robert Fraser

Reputation: 10927

Use this:

#pragma warning disable 420
if(Interlocked.CompareExchange(ref isLoaded, 1, 0) != 0)
    return;
#pragma warning restore 420

Upvotes: 31

Darin Dimitrov
Darin Dimitrov

Reputation: 1039438

You are not doing anything wrong. According to the documentation:

A volatile field should not normally be passed using a ref or out parameter, since it will not be treated as volatile within the scope of the function. There are exceptions to this, such as when calling an interlocked API.

Upvotes: 47

Kent Boogaart
Kent Boogaart

Reputation: 178810

You're getting the error because you're passing the field by reference. I think what this means is that the target method has no idea the field is marked as volatile, and therefore will not treat it as such.

Upvotes: 3

Jon Skeet
Jon Skeet

Reputation: 1503389

Basically the warning is that when you pass a volatile field by reference, the calling code doesn't know to treat it in a volatile manner. For Interlocked.Increment that probably doesn't matter, due to the nature of the method - but then you don't need the variable to be volatile anyway if you're using Interlocked.

In general, I think I'd avoid mixing the two - if you're using Interlocked, do it everywhere (using Interlocked.CompareExchange(ref counter, 0, 0) to read it). I can't say I use volatile very often, personally. For simple counters I might use Interlocked, but I'm more likely to use a lock for most tasks.

Upvotes: 35

Related Questions