码迷,mamicode.com
首页 > 编程语言 > 详细

线程锁 线程并发

时间:2015-08-05 01:03:50      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

《》

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static int max=10000000;
        static long _count = 0;

        static void Main(string[] args)
        {
            //Console.WriteLine("主线程运行");
            Thread t1 = new Thread(new ThreadStart(() =>
            {
                for (int i = 0; i < max; i++)
                {
                    _count--;
                }

            }));
            t1.Start();
            Console.WriteLine("t1线程已经启动,开始对_count变量++");
            Console.WriteLine("主线程继续执行.......");
            

            for (int i = 0; i < max; i++) 
            {
                _count++;
            }

            t1.Join();
            Console.WriteLine("_count的值是" + _count);
            Console.ReadKey();
        }
    }
}

技术分享

程序的执行结果,并没有我们想象中的_count=0

原因如下:

其实_count++ 的意思是:

总共分为三步: 第一步:把_count变量中的值取出来   第二步:将取出来的值加1   第三部:将加1后的值在赋值给_count

现在是主线程执行_count++的任务,而子线程t1执行的是_count-- 的任务

因为我们不只是CPU什么时候调度主线程,什么时候调度子线程,那我们可以做个假设。假如cpu最先调度主线程把0从_count中取出,然后++变成了1 然后又把1赋值给_count ,而当主线程执行了这三步了,而子线程t1一次都没被调用,单主线程执行第四部在把把1从_count中取出,t1这个子线程还是没有被CPU调度执行。

在第五步的时候,此时cpu调度了子线程t1,而没有调度主线程,此时t1这个线程里执行的是 从_count中把1取出 ,而就在t1从_count中把1取出后,CPU又去调度主线程去了

所以第六步 ,主线程执行的是 把取出的1加加结果是2,然后第七步CPU又没有调度子线程,而是调度的是主线程,此时主线程执行的是:把2赋值给_count 

当第八步的时候,CPU终于调度子线程t1了。因为在第五步的时候t1已经从_count中把1取出 所以 第八步的时候子线程执行--操作,把取出的1递减结果是0  而第九步CPU有是调度t1这个子线程 ,子线程t1执行的是 把0赋值给_ount

以上结论是 假如主线程和子线程里的循环都循环1千万次,当主线程调用了6次的时候将_count从0自增到了2   而子线程仅仅执行了3次就将“2”--到0,其实这样说不对,应该说

将2直接赋值为0了


技术分享


版权声明:本文为博主原创文章,未经博主允许不得转载。

线程锁 线程并发

标签:

原文地址:http://blog.csdn.net/fanbin168/article/details/47285475

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!