首页 新闻 会员 周边

关于线程lock的诡异错误,msdn中的C#编程指南里面的一个范例,程序红色部分为问题

0
悬赏园豆:30 [已解决问题] 解决于 2010-09-15 15:04

using System;

using System.Threading;

namespace LockTest
{
    class Account
    {
        private object thisLock = new object();
        double balance;

        Random r = new Random();
        public int number = 0;

        public Account(double Initial)
        {
            balance = Initial;
        }
        double WithDraw(double amount)
        {
           
            if (balance < 0)
                throw new Exception("余额为负");
            lock (thisLock)
            {
                if (balance >= amount)
                {
                    number++;
                    Console.WriteLine("number:" + number);
                    Console.WriteLine("取款前余额:{0}", balance);
                    Console.WriteLine("取款:{0}:", amount);
                    balance -= amount;
                    Console.WriteLine("取款后余额:{0}\n", balance);
                    return amount;
                }
                else
                {
                    Console.WriteLine("余额不足");
                    return 0;
                }
            }          
        }
        public void DoTransactions()
        {
            int num = 6;
            for (int i = 0; i < num; i++)  //当num>=6时出现问题,没有打印"number:1",但num=1-5时是正常的。
            {
                WithDraw(r.Next(1, 100));
            }          
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Thread[] threads = new Thread[10];
            Account acc = new Account(10000);
            for (int i = 0; i < 10; i++)
            {
                Thread t = new Thread(new ThreadStart(acc.DoTransactions));
                threads[i]=t;
                threads[i].Start();
            }
            //for (int i = 0; i < 10; i++)
            //{
            //    threads[i].Start();
            //}
        }
    }
}

码魔谷的主页 码魔谷 | 初学一级 | 园豆:193
提问于:2010-09-13 16:30
< >
分享
最佳答案
0

 i < num ,而 num = 6

num > = 6 时, 退出 for 循环,WithDraw(r.Next(1, 100)); 就不执行了.

收获园豆:28
Launcher | 高人七级 |园豆:45045 | 2010-09-13 17:11
可能我的解释不清楚,我指的是当num设置的值大于等于6是出现该问题,比如num=6时没有打印"number:1",但设置num=5时是会打印这个"number:1"的,也就是num设置的值大于等于6时在执行WithDraw()时没有执行Console.WriteLine("number:" + number);
码魔谷 | 园豆:193 (初学一级) | 2010-09-13 18:00
其他回答(1)
0

 我把你的代码运行了一下,没有任何问题,即使把num改成26也没有问题啊,不会出现你说的那种情况,你再试一下,是不是看错了

收获园豆:2
寒狐 | 园豆:433 (菜鸟二级) | 2010-09-14 09:42
num=6时的截图http://images.cnblogs.com/cnblogs_com/mamogu/261609/o_num=6.jpg num=5时的截图 http://images.cnblogs.com/cnblogs_com/mamogu/261609/o_num=5.jpg 麻烦帮忙看下
支持(0) 反对(0) 码魔谷 | 园豆:193 (初学一级) | 2010-09-14 11:11
@码魔谷:CMD不够行输出.你把 Console.WriteLine 改成 Debug.WriteLine,然后从VS的输出窗口中查看结果.
支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2010-09-14 13:26
非常感谢,在输出窗口看到了!
支持(0) 反对(0) 码魔谷 | 园豆:193 (初学一级) | 2010-09-15 15:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册