zoukankan      html  css  js  c++  java
  • 深入C#并行编程(1) -- 了解线程

      一、操作系统用进程(Processe)分隔正在执行的程序,用线程(Thread)作为操作系统分配处理器时间的基本单元,进程上下文中可以运行多个线程,进程的所有线程共享其虚拟地址空间,所有线程均可执行程序代码中的任意部分,包括其他线程正在执行的代码;

      1.默认情况下,.NET程序只启动单个线程,被称为主线程(Primary Thread),也可以在运行时开启其它线程,与主线程并行同时执行代码,这些线程被称为工作线程(Worker Thread);由.Net开启和管理的线程通常称为托管线程(Managed Thread);

      2.托管线程又分为前台线程和后台线程,两者类似,但前台线程会阻止进程停止,而后台线程不会,即当进程的Main方法结束后,只有在所有前台线程都停止时,CLR才会结束该进程,此时会对仍处于活动状态的后台线程调用Abort方法来结束所有后台进程;

      ※关闭程序如遇到无法关闭所有线程时,可以在Main方法结束前通过以下代码强制关闭所有线程,详见:

    System.Environment.Exit(0);

      二、在使用多线程时,不同线程不仅可以同时执行同一段代码,还可以同时访问同一内存中的数据,所以会存在一定的数据冲突问题,称为争用条件(Race Condition):

    static int MyNum;
    static int RaceConditionCount;
    static void MyFunc()
    {
        while (true)
        {
            if (MyNum == 0)
            {
                MyNum++;
                if (MyNum == 0)
                {
                    RaceConditionCount++; //只有在出现争用条件时才会执行此语句
                }
            }
            MyNum = 0;
        }
    }
    static void Main(string[] args)
    {
        for (int i = 0; i < 2; i++)
        {
            Thread thread = new Thread(MyFunc);
            thread.Start();
        }
        Thread.Sleep(1000);
        Console.WriteLine(RaceConditionCount); //输出1秒内产生争用条件的次数
        Console.Read();
    } 

      1.对于争用条件的发生频率,发布版本比调试版本的出现次数多(发布版本编译出的代码被优化过而且开启了JIT优化),多核CPU比单核CPU的出现次数多(多核CPU中多个线程可以同时运行,单核CPU的线程调度是抢占式的,也会出现此问题,只是次数较少);

      三、为了避免产生争用条件,需要注意数据的同步问题,可以通过给对象加锁,使同一时间内只有一个线程可以执行加锁对象所锁定的代码;


    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

    作者:Minotauros
    出处:https://www.cnblogs.com/minotauros/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    分数的加减法——C语言初学者代码中的常见错误与瑕疵(10)
    关于陈冰、陈良乔以及《我的第一本C++书》【转】
    逻辑训练与说理教育从小学开始【转】
    薛非《品悟C-抛弃C程序设计中的谬误与恶习》读后感part1【转】
    C语言初学者代码中的常见错误与瑕疵(9)
    为什么在我眼里你是一只傻逼——傻逼“常所用”句型之(1)——“就算……但是……”
    要心中有“数”——C语言初学者代码中的常见错误与瑕疵(8)
    220v转5v阻容降压电路
    IAR for stm8 memory窗口的功能
    stm8 io口重映射
  • 原文地址:https://www.cnblogs.com/minotauros/p/10129042.html
Copyright © 2011-2022 走看看