首页 新闻 会员 周边 捐助

C# 模拟CAS不对

0
悬赏园豆:100 [已解决问题] 解决于 2019-04-28 13:07
public class ThreadTest_V5
    {
        public volatile int count = 0;
        public void Add1()
        {
            int index = 0;
            while (index++ < 1000000)//100万次
            {
                int oldData;
                int newData;
                do
                {
                    oldData = count;
                    newData = oldData + 1;
                } while (!CompareAndSet(oldData, newData));
            }
        }

        public void Add2()
        {
             int index = 0;
            while (index++ < 1000000)//100万次
            {
                int oldData;
                int newData;
                do
                {
                    oldData = count;

                    newData = oldData + 1;
                } while (!CompareAndSet(oldData, newData));
            }
        }

        private bool CompareAndSet(int oldData, int newData)
        {
            if (count == oldData)
            {
                count = newData;
                return true;
            }
            return false;
        }
    }
static void V5()
        {
            ThreadTest_V5 testV5 = new ThreadTest_V5();
            Thread th1 = new Thread(testV5.Add1);
            Thread th2 = new Thread(testV5.Add2);

            th1.Start();
            th2.Start();
            th1.Join();
            th2.Join();

            Console.WriteLine($"V5:count = {testV5.count}");
        }

这是我模拟的CAS操作,运行结果不是200万,是 100万到200万之间的随机数。我实现的CAS方式不对么?

K战神的主页 K战神 | 初学一级 | 园豆:93
提问于:2019-04-28 00:54

CAS是什么意思?

会长 5年前

@会长: 比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。 该操作通过将内存中的值与指定数据进行比较,当数值一样时将内存中的数据替换为新的值。--避免使用锁,也就是无锁结构

K战神 5年前

@K战神: 谢谢

会长 5年前
< >
分享
最佳答案
0

Interlocked.Increment(ref count);//原子操作对count进行累加

if (count == oldData)
{
count = newData;
return true;
}
这一部分并不是原子性操作
2个线程可能的情况下,同时到达if内执行。

收获园豆:100
czd890 | 专家六级 |园豆:14488 | 2019-04-28 11:48

Interlocked.Increment(ref count);
-- 既然是原子性的那我直接使用这个就可以了,是不是不需要再模拟CAS

https://www.cnblogs.com/sunchong/p/10780416.html
--这是我写的博客,最后有这样一个问题,所以就提出来了

K战神 | 园豆:93 (初学一级) | 2019-04-28 12:45

@K战神: 高级开发语言没法模拟出来,只能使用线程的api,实现原子性操作是在底层,CPU指令级别

参考:http://www.cnblogs.com/noKing/p/9094983.html

czd890 | 园豆:14488 (专家六级) | 2019-04-28 13:05

@czd890: 理解了,谢谢回复,马上去补充

K战神 | 园豆:93 (初学一级) | 2019-04-28 13:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册