波斯马BOSSMA Information Technology

C#多线程的同步与通信

发布时间:2010年9月13日 / 分类:DOTNET / 12,821 次浏览 / 评论

C#中使用lock和Monitor控制多线程对资源的使用,最常见的生产者和消费者问题就是多线程同步和通信的经典例子。这篇文章通过例子来了解C#多线程的同步与通信。

一、关于lock和Monitor

lock可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其它线程必须等待。格式定义如下:

expression代表要跟踪的对象,通常是引用。一般地,如果想保护一个类的实例,使用this;如果保护一个静态变量(如互斥代码段在一个静态方法内部),使用类名就可以了。而statement_block就是互斥段的代码。

Monitor用于多线程公用一个对象时使线程共享资源的方案。Monitor必须和一个具体的对象相关联。

二、生产者和消费者问题

假设两个线程同时维护一个队列,如果一个线程对队列中更新元素,而另外一个线程从队列中获取元素,那么我们称更新元素的线程为生产者,称获取元素的线程为消费者。

1、被操作对象

2、生产者和消费者

3、线程操作

通过lock锁定Counter对象的引用,初始readFlag为false控制线程1等待读取:Monitor.Wait(this),线程2写入,然后更改readFlag,然后执行:Monitor.Pulse(this),通知等待队列中的线程请求对象状态已发生改变,线程1锁定this,执行读操作,然后更改readFlag,线程1和线程2交互执行写读的操作。

同时因为readFlag的存在和交替更新,避免了死锁情况的发生。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《C#多线程的同步与通信

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论