zoukankan      html  css  js  c++  java
  • 多线程简单阐述

    多线程简单阐述

    what?
    在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。
    进程中会有一个默认的线程,此默认的线程会负责界面的创建和相应用户的操作,因此默认线程也叫UI线程,主线程。学习操作系统可以了解。

    why?

    线程的引入是为了减少程序并发执行的开销,提高并发性。线程是作为调度和分派的基本单位,而进程则是资源分配的基本单位。正是由于将这两方面的分开,使得线程几乎不占资源,而可以轻装前进,使得系统并发性显著提高。多线程的引入也是为了一次执行多件事情,也是提高了并发执行。
    

    how?
    多线程的实现
    1.首先添加命名空间(包含线程操作)
    using System.Threading
    2. 线程的参数,通过观察c#中线程的实现可以知道Thread(ThreadStart start)
    此参数为委托类型用来传递需要执行的方法,该委托public delegate void ThreadStart(),因为函数签名要与委托一致,所以所传入的方法无返回值,无参数。而我们只需传入方法名即可,可以认为是一种简写,vs帮我们隐士的实现了委托。
    3. 首先写出需要传入的方法。
    4. 创建线程的对象。
    5. 调用线程对象的Start()方法。
    此方法只是标志。该线程可以执行,但不一定立即执行,只是放到cpu的可调度队列中。具体的执行时间需要看cpu的调度。

    为线程执行计时
    DateTime begeinTime = DateTime.Now
    一段需要测算时间的代码
    TimeSpan ts= beginTime.Subtract(DateTime.Now);
    MessageBox.Show(ts.TotalMilliseconds)

    前台线程和后台线程
    1.c#中所应用的线程其实是调用了系统的线程。
    2.创建线程默认为前台线程,特点,所有的前台线程结束后,程序才结束。
    3. 后台线程,特点,只要前台线程全部结束,后台线程自动关闭。
    设置后台线程 调用线程对象的一个IsBackGround方法设置为True

    线程的同步问题

    C#中禁止跨线程访问。

    TextBox.CheckForIllegalCrossThreadCalls=false;任何一个控件都可以调用禁止跨线程访问。

    线程的同步问题,类似与操作系统中进程同步问题。由于cpu执行任务的时候,应用时间片轮转原则在不同任务中进行切换而操作的,因此会产生进程同步问题,即一个进程在执行过程中被切换,另一个进程执行,如过这两个进程中有相关的操作,可能会导致结果的错误。(同理可以理解线程,就是线程重入问题)

    线程的调度方式

    由于cpu调度的时间片轮转原则所以分为:抢占式和非抢占式两种

    同步问题在c#中的方法,就是操作系统中线程互斥锁。
    加锁即可
    lock(this)
    {
    线程执行的代码
    }

    线程的内部实现

    首先查看Thread的定义可以看到其参数类型是ThreadStart,在查看其定义可以知道,其实使用委托实现,那么目标基本清楚了。
    public delegate void ThreadStart()

    大致模拟一下线程的实现代码
    自己写一个类MyThread模拟,内部实现可以理解为:
    首先定义了一个委托作为线程的参数
    然后利用构造函数对线程进行初始化,最后实现各种方法。

    ThreadStart threads;
    public MyThread(ThreadStart ts)
    {
    this.threads = ts;
    }
    public void Start()
    {
    threads();
    }

    线程中常用方法:

    Start()启动线程
    Abort()终止线程
    Thread.Sleep(int time休息毫秒数)
    静态方法,暂停当前线程一段时间
    Thread.CurrentThread()
    获取当前线程的引用(就是取得当前cpu运行的线程)

    线程中执行带参数的方法

    上面刚才已经提到了,线程的参数用委托实现,既然是委托实现,那么方法的签名需要和该委托的签名一致。无返回值无参数。那定义一个带参数的函数可定不能用该方法。

    这里线程还提供了一个
    public Thread(ParameterizedThreadStart start)方法,其参数的具体定义是
    public delegate void ParameterizedThreadStart(object obj)
    那么就是一个带object参数的方法,如果需要传参,则使用该方法。与之匹配的还有一个public void Start(object parameter);方法用来传入函数的参数。

    线程中执行带多个参数的方法

    既然已经有了一个带object参数的方法,object是任何对象的父类,那么可以传递任何类型的参数都行。

    laizi:https://www.cnblogs.com/summers/archive/2013/04/13/3019521.html

  • 相关阅读:
    C++ 的继承与虚函数 读书笔记
    C++ 类 、构造、 析构、 重载 、单例模式 学习笔记及练习
    C++ 入门随手笔记及联系
    计算机网络通信、线程、tcp、udp通信及信号量等读书笔记
    进程 信号 通信 消息队列 共享内存 进程间通信 等读书笔记及个人小练习
    C++发展概述、优缺点及应用领域
    剪枝例题大全+题解
    (可行性剪枝,上下界剪枝)「一本通 1.3 例 1」数的划分
    呜呜呜
    「一本通 1.3 例 5」weight]
  • 原文地址:https://www.cnblogs.com/Bing010407/p/13944557.html
Copyright © 2011-2022 走看看