多线程学习系列:(四)线程同步基础下
2011-01-27 11:30
134 查看
回顾一下上次,我们讨论了lock/AutoResetEvent/ManualResetEvent以及Semaphore。这些用于线程同步的结构叫做同步基元。同步基元从类型上可以分为锁定/通知/联锁三种。lock显然锁定方式,而且是独占锁定,也就是在锁释放之前不能由其它线程获得。 Semaphore也是一种锁定,只不过不是独占锁,可以指定多少个线程访问代码块。AutoResetEvent和ManualResetEvent当然就是通知方式了,前者在通行之后自动重置,后者需要手动重置。我们还看到了即使使用同步机制不一定能确保线程按照我们规划的去执行,因为从根本上来说,操作系统的线程调度我们是没有办法预测的,除非使用阻塞或锁等待等方式,否则我们很难去预测两个无关的线程究竟哪个先得到执行(即使设置了优先级),而且在使用这些同步机制的时候我们也要考虑到性能问题,如果多线程程序做的不好的话很可能会比单线程执行效率还低,比如我们开启了多个线程相互阻塞等待并没有任何的并行运算,比如在一个多线程环境汇总我们锁的范围很大,导致多线程环境变为了一个单线程环境,有关性能问题以后再讨论,这次我们来看看其它的一些同步基元。
本文的例子基于上文定义的一些基本静态对象:
使用lock保护共享资源不被多个线程同时修改是常见的做法,其实lock本质上基于Monitor,而使用Monitor本身可以带来更丰富的特性,比如可以设置超过某个等待时间段就不继续等待:
本文的例子基于上文定义的一些基本静态对象:
static int result = 0; static object locker = new object(); static EventWaitHandle are = new AutoResetEvent(false); static EventWaitHandle mre = new ManualResetEvent(false);
使用lock保护共享资源不被多个线程同时修改是常见的做法,其实lock本质上基于Monitor,而使用Monitor本身可以带来更丰富的特性,比如可以设置超过某个等待时间段就不继续等待:
相关文章推荐
- 多线程学习系列:(三)线程同步基础上
- C# 多线程学习系列三:线程优先级、线程同步以及向线程传递参数
- .Net学习难点讨论系列14 – 多线程下的进程同步(线程同步问题总结篇)
- cocos2d基础学习--多线程使用及线程同步
- 多线程学习系列:(五)线程池基础上
- 多线程学习系列:(六)线程池基础下
- 多线程学习系列:(八)Winform中多线程编程基础上
- 多媒体基础学习系列
- [原]零基础学习在Android进行SDL开发系列文章
- 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼
- Mybatis 系列(4)——第一天学习笔记(基础知识)
- 多线程编程学习::POSIX 多线程基础(二)
- JAVA进阶学习-多线程基础详解(三)锁
- [叩响C#之门]写给初学者:多线程系列(六)——线程同步的概念
- [转]Ultra Fractal教程系列09——学习基础技巧01——创建另一个分形
- java 多线程系列基础篇(二)
- [转]Ultra Fractal教程系列10——学习基础技巧02——学习使用Switch模式
- js(javaScript)学习系列--基础
- 一步一步学习多线程系列文章---开篇《Threading in C#》翻译
- Java基础学习第二十五天——多线程学习总结(二)