这里如果用线程池打印i的话为什么一直是100呢?

来源:14-4 【操作】前台线程、后台线程与线程池托管

慕前端8369922

2022-06-25

        a = new List<int>();
        a.Add(0);

        for (int i = 0; i < 100; i++)
        {
            //var t = new Thread(() =>{
            //    Console.WriteLine(i + " " + Thread.CurrentThread.ManagedThreadId);
            //});
            //t.Start();
            ThreadPool.QueueUserWorkItem((o) =>
            {
                a[0] = a[0] + 1;
                Console.WriteLine(i + " " + Thread.CurrentThread.ManagedThreadId);
            });

        }
        Thread.Sleep(1000);
        Console.WriteLine("quit " + a[0]);

结果如下

图片描述

为什么i一直是100呢?

写回答

1回答

阿莱克斯刘

2022-06-27

这个问题非常好,要回答这个问题需要先研究一下14-7关于线程锁和资源竞争内容。因为for循环中的i实际上是被100个线程共享的,所以,当i发生变化的时候会直接影响所有的线程。而for循环中线程池中的线程会先完成所有的线程创建,然后再以回调的方式的执行。而在线程池内线程执行的时候,其实100线程已经全部创建完成了,也就是说for循环已经结束了,也就是说此时i的取值为100。所以,我们看到的所有i的输出全部都是100。
0
1
慕前端8369922
老师在这个地方可以有办法让i输出原本的数据而不都是100嘛?
2022-06-27
共1条回复

C#速成指南--从入门到进阶,实战WPF与Unity3D开发

系统掌握C#核心和应用,获得全行业适配的技能

839 学习 · 198 问题

查看课程