线程同步与线程异步_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 线程同步与线程异步

线程同步与线程异步

 2017/11/28 13:01:54  Yulong5759  程序员俱乐部  我要评论(0)
  • 摘要:从线程执行任务的方式上可以分为线程同步和线程异步。而为了方便理解,后面描述中用“同步线程”指代与线程同步相关的线程,同样,用“异步线程”表示与线程异步相关的线程。线程异步就是解决类似前面提到的执行耗时任务时界面控件不能使用的问题。如创建一个次线程去专门执行耗时的任务,而其他如界面控件响应这样的任务交给另一个线程执行(往往由主线程执行)。这样,两个线程之间通过线程调度器短时间(时间片)内的切换,就模拟出多个任务“同时”被执行的效果。线程异步往往是通过创建多个线程执行多个任务,多个工作线同时开工
  • 标签:线程 同步 异步

线程执行任务的方式上可以分为线程同步和线程异步。而为了方便理解,后面描述中用“同步线程”指代与线程同步相关的线程,同样,用“异步线程”表示与线程异步相关的线程。

  线程异步就是解决类似前面提到的执行耗时任务时界面控件不能使用的问题。如创建一个次线程去专门执行耗时的任务,而其他如界面控件响应这样的任务交给另一个线程执行(往往由主线程执行)。这样,两个线程之间通过线程调度器短时间(时间片)内的切换,就模拟出多个任务“同时”被执行的效果。

  线程异步往往是通过创建多个线程执行多个任务,多个工作线同时开工,类似多辆在宽广的公路上并行的汽车同时前进,互不干扰(读者要明白,本质上并没有“同时”,仅仅是操作系统玩的一个障眼法。但这个障眼法却对提高我们的程序与用户之间的交互、以及提高程序的友好性很有用,不是吗)。

  在介绍线程同步之前,先介绍一个与此紧密相关的概念——并发问题。

  前面提到,线程都是独立的执行单元,可以访问共享的数据。也就是说,在一个拥有多个次线程的程序中,每个线程都可以访问同一个共享的数据。再稍加思考你会发现这样可能会出问题:由于线程调度器会随机的挂起某一个线程(前面介绍的线程间的切换),所以当线程a对共享数据D的访问(修改、删除等操作)完成之前被挂起,而此时线程b又恰好去访问数据D,那么线程b访问的则是一个不稳定的数据。这样就会产生非常难以发现bug,由于是随机发生的,产生的结果是不可预测的,这样样的bug也都很难重现和调试。这就是并发问题。

  为了解决多线程共同访问一个共享资源(也称互斥访问)时产生的并发问题,线程同步就应运而生了。线程同步的机理,简单的说,就是防止多个线程同时访问某个共享的资源。做法很简单,标记访问某共享资源的那部分代码,当程序运行到有标记的地方时,CLR(具体是什么可以先不管,只要知道它能控制就行)对各线程进行调整:如果已有线程在访问一资源,CLR就会将其他访问这一资源的线程挂起,直到前一线程结束对该资源的访问。这样就保证了同一时间只有一个线程访问该资源。打个比方,就如某资源放在只有一独木桥相连的孤岛上,如果要使用该资源,大家就得排队,一个一个来,前面的回来了,下一个再去,前面的没回来,后面的就原地待命。

  这里只是把基本的概念及原理做了一个简单的阐述,不至于看后面的程序时糊里糊涂的。具体如何编写代码,下面的段落将做详细介绍

发表评论
用户名: 匿名