首页 > 解决方案 > 不挥发多长时间?在这种情况下我应该使用 volatile 吗?

问题描述

sealed class Counter
{
    private long _v = long.MinValue;

    public bool GetNextNumber(out ulong output)
    {
        long v0, v1;
        ulong max = ulong.MaxValue - (ulong)1;
        output = 0;

        do
        {
            v0 = _v;
            if (unchecked((ulong)v0 > max))
                return false;

            v1 = v0 + 1;
        }
        while (v0 != Interlocked.CompareExchange(ref _v, v1, v0));

        output = unchecked((ulong)v0);
        return true;
    }
}

这是一个计数器类,每次调用GetNextNumber都会生成一个唯一的号码。

我使用 cas 循环来防止计数器溢出。

问题是这一行v0 = _v,由于 long 不能是 volatile 的,v0当许多线程同时调用该方法时是否可能得到错误的值?

如果是这样,我怎样才能防止它发生?

标签: c#

解决方案


推荐阅读