tabs ↹ over ␣ ␣ ␣ spaces

by Jiří {x2} Činčura

.NET types that can be read and written atomically without the risk of tearing

12 Dec 2016 .NET, .NET Core, Multithreading/Parallelism/Asynchronous/Concurrency

I’m currently digging deep into memory models, processor architectures, kernels and so on. It’s a fun stuff. I’m learning so much and my brain is working so hard. With that I’m also digging into some “concurrent” internals in .NET, in last few days the ConcurrentDictionary<TKey, TValue> class. As I was there I found something helpful.

Take a look here. It’s a list of types where tearing doesn’t happen. Of course unless misaligned manually. Awesome!

/// <summary>
/// Determines whether type TValue can be written atomically
/// </summary>
private static bool IsValueWriteAtomic()
    // Section 12.6.6 of ECMA CLI explains which types can be read and written atomically without
    // the risk of tearing.
    // See
    Type valueType = typeof(TValue);
    bool isAtomic =
        !valueType.GetTypeInfo().IsValueType ||
        valueType == typeof(bool) ||
        valueType == typeof(char) ||
        valueType == typeof(byte) ||
        valueType == typeof(sbyte) ||
        valueType == typeof(short) ||
        valueType == typeof(ushort) ||
        valueType == typeof(int) ||
        valueType == typeof(uint) ||
        valueType == typeof(float);

    if (!isAtomic && IntPtr.Size == 8)
        isAtomic =
            valueType == typeof(double) ||
            valueType == typeof(long) ||
            valueType == typeof(ulong);

    return isAtomic;

Although I said it’s helpful, I don’t that mean anybody should rely on that. It’s good as brain training. Not for production level code. There’s a gazillion pieces that need to fit together to work correctly (platform, it’s memory model; compiler; JIT optimizations; …).

But for studying… Oh my.