浅谈.NET下的多线程和并行计算(四)线程同步基础 下

回顾一下上次,我们讨论了lock/AutoResetEvent/ManualResetEvent以及Semaphore。这些用于线程同 步的结构叫做同步基元。同步基元从类型上可以分为锁定/通知/联锁三种。lock显然锁定方式,而且是独 占锁定,也就是在锁释放之前不能由其它线程获得。 Semaphore也是一种锁定,只不过不是独占锁,可以 指定多少个线程访问代码块。AutoResetEvent和ManualResetEvent当然就是通知方式了,前者在通行之后 自动重置,后者需要手动重置。我们还看到了即使使用同步机制不一定能确保线程按照我们规划的去执行 ,因为从根本上来说,操作系统的线程调度我们是没有办法预测的,除非使用阻塞或锁等待等方式,否则 我们很难去预测两个无关的线程究竟哪个先得到执行(即使设置了优先级),而且在使用这些同步机制的 时候我们也要考虑到性能问题,如果多线程程序做的不好的话很可能会比单线程执行效率还低,比如我们 开启了多个线程相互阻塞等待并没有任何的并行运算,比如在一个多线程环境汇总我们锁的范围很大,导 致多线程环境变为了一个单线程环境,有关性能问题以后再讨论,这次我们来看看其它的一些同步基元。

本文的例子基于上文定义的一些基本静态对象:

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本身可以带来更丰富的特性,比如可以设置超过某个等待时间段就不继续等待:

for (int i = 0; i < 10; i++)
{
   new Thread(() =>
   {
     if (Monitor.TryEnter(locker, 2000))
     {
       Thread.Sleep(1000);
       Console.WriteLine(DateTime.Now.ToString("mm:ss"));
       Monitor.Exit(locker);
     }
   }).Start();
}

在这段代码中我们开启10个线程尝试申请locker独占锁,通过输出结果可以看出,由于我们设置了2秒 超时,程序只输出了三次:

计算(四)线程同步基础 下-java 多线程并行执行">

在第一个线程获取锁之后,一秒后释放,第二个线程获取,一秒后又释放,第三个线程最后获取到, 之后的线程都超过了2秒等待时间,TryEnter返回false,线程结束。

时间: 2024-11-17 06:05:16

浅谈.NET下的多线程和并行计算(四)线程同步基础 下的相关文章

浅谈java中异步多线程超时导致的服务异常_java

在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调

浅谈.NET下的多线程和并行计算(十四)并行计算前言

之前的文章中我们介绍了如何在.NET下运用相关类库进行多线程编程的基础,我们知道.NET 4.0已经 正式推出了,带来的重要特性是并行库.本文就谈谈对并行计算的一些理解和看法.并行计算不是一个很 新的概念,其实它就是通过多线程把同一个任务分割成多个子任务并行的执行的过程..NET 4.0并行库不 但提供了这方面的支持,而且还封装了多线程开发的各种场景,使得我们不需要依赖Thread/同步基元等 "底层"的对象就可以进行多线程开发.没有.NET 4.0的并行计算库我们同样可以进行并行计算

浅谈.NET下的多线程和并行计算(一)前言

作为一个ASP.NET开发人员,在之前的开发经历中接触多线程编程的机会并不是很多,但是随着.NET 4.0的发布临近,我越来越感受到未来的1-2年中并行计算将会有很大的应用.于是决定通过写日志的方式 来总结一下.NET 3.5下的多线程编程进而引入.NET 4.0提供的新的并行库以及新的并行编程模式和编程的 思维方式. 个人觉得在日常的编程中对于ASP.NET程序员来说使用多线程编程不是很多,其实我们无时无刻不在享 受多线程的优势.首先,WEB服务器环境就是一个多线程环境,每一个请求都是独立的线

浅谈.NET下的多线程和并行计算(九)Winform中多线程编程基础 下

在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI 线程上操作控件,否则很容易产生人品问题.可以想到,上次介绍的两个Timer基于ThreadPool,回调方 法运行于不同于UI线程的新线程上,在这个方法中操作控件需要进行 Invoke或BeginInvoke.其实,还有 第三种System.Windows.Forms.Timer,它可以让回调事件在UI线程上执行,我们来做一个实验比较一下 System.Windows.Forms.T

浅谈.NET下的多线程和并行计算(十三)CLR via C#第三版阅读笔记(2)

线程同步的问题 1) 我们必须找到代码中所有可能被多个线程同时访问的资源,然后使用线程同步来保护资源,并且 我们没有办法来验证是不是正确进行了线程同步,包括是否有遗漏和是否对不需要同步的资源进行同步. 2) 线程同步是有损性能的,如果某个操作大量执行,并且这个操作原先的执行时间非常短,那么如 果我们对这段操作前后进行锁的申请和释放的话性能可能下降一个数量级. 3) 线程同步可能导致更频繁的线程创建和上下文的切换. 当然,只有在下面的情况下才需要线程同步,换句话说我们尽量不要使用下面的方案来导致线

浅谈.NET下的多线程和并行计算(三)线程同步基础 上

其实,如果线程都是很独立的,不涉及到任何资源访问的,那么这些毫无干扰的线程不会产生什么问 题.但是在实际应用中我们的线程总是涉及到资源访问的,而且往往涉及到共享资源的访问,那么就产生 了线程同步的问题.一直觉得线程同步这个名词很奇怪,字面上看同步就是使得步调一致,线程同步是不 是就是让线程步调一致的访问资源呢?事实上反了,线程同步恰巧是让线程不同时去访问资源而是去按照 我们期望的顺序依次访问资源(是同步资源访问的行为而不是同步同时访问资源).一句话,多个线程( 不仅仅局限于相同进程)如果需要访问

浅谈八点新浪家居结合百度搜索营销招数(下)

上面一篇文章飞飞:浅谈八点新浪家居结合百度搜索营销招数(上)飞飞分析了四点新浪家居与百度搜索营销招数的其中四点,今天再分析其另外4点. 1搜索营销之百度百科,专业Web2.0编辑. 百度百科可谓一个互联网大智囊,充分调动网民的力量,汇集上亿用户的智慧,进行分享交流,新浪乐居在百科合作编辑词条,不仅可以帮助受众全面系统地了解品牌网站,同时也使信息更具品牌信服力. 2.搜索营销之知道专家,专业互动提升专业形象. 为全面提高百度知道平台的问答质量,帮助广大网友快速解决有关房产家居方面的问题,百度为新浪

浅谈JavaScript中setInterval和setTimeout的使用问题_基础知识

说到setInterval,就不得不提到setTimeout,二者都是用于定时执行某函数,区别在于setTimeout 只执行一次,而setInterval可以一直连续不断执行下去,典型用法如下: function do_sth() { console.log('Hello...'); } setTimeout(do_sth, 2500); // 2.5 秒后,执行 do_sth 函数(只执行一次) setInterval(do_sth, 3500); // 3.5 秒后,执行 do_sth 函

浅谈中小企业网络推广最有效的四种方式

中介交易 SEO诊断 淘宝客 云主机 技术大厅 近几年,随着互联网的快速的发展,国家对发展电子商务战略越来越重视,据消息称我国未来10年将有1万亿资金投入到电子商务.电子政务项目建设 中,越来越多的传统中小企业也应用和开展网络营销,市场竞争越来越大,现代中小企业如何在对手林立的市场中另辟蹊径呢,下面跟大家浅谈一下中小企业如何进 行网络推广 一. 广泛发布信息 首先加入各大行业B2B网站,把企业的信息发布物流行业的每个角落,这样客户更加容易找到你.全世界最伟大的汽车营销大师乔·吉拉德,就是满世 界