学习多线程 笔记
首先先来个一线的链接吧 毕竟我是看着他的博客写的
http://www.cnblogs.com/huangxincheng/archive/2012/03/14/2395279.html
一:Thread的使用
Start 开始
Stop 结束
sleep 延迟 阻塞的指定时间
Abort 相当于break 抛出的是 ThreadAbortException 异常。
join 可以让并发行处理变成串行化 阻塞调用线程,直到某个线程终止时为止。
Interrupt 如果终止工作线程,只能管到一次,工作线程的下一次sleep就管不到了,相当于一个 contine操作。 抛出的是 ThreadInterruptedException 异常。
进入临界区
Monitor.Enter(obj);
、、、、、内容
退出临界区
Monitor.Exit(obj);
Monitor.Wait和Monitor.Pulse
首先这两个方法是成对出现,通常使用在Enter,Exit之间。
Wait: 暂时的释放资源锁,然后该线程进入”等待队列“中,那么自然别的线程就能获取到资源锁。
Pulse: 唤醒“等待队列”中的线程,那么当时被Wait的线程就重新获取到了锁。
ReaderWriterLock类
先前也知道,Monitor实现的是在读写两种情况的临界区中只可以让一个线程访问,那么如果业务中存在”读取密集型“操作,就
好比数据库一样,读取的操作永远比写入的操作多。针对这种情况,我们使用Monitor的话很吃亏,不过没关系,ReadWriterLock
就很牛X,因为实现了”写入串行“,”读取并行“。
ReaderWriteLock中主要用3组方法:
<1> AcquireWriterLock: 获取写入锁。
ReleaseWriterLock:释放写入锁。
<2> AcquireReaderLock: 获取读锁。
ReleaseReaderLock:释放读锁。
<3> UpgradeToWriterLock:将读锁转为写锁。
DowngradeFromWriterLock:将写锁还原为读锁。
ReaderWriterLock rw = new System.Threading.ReaderWriterLock();
//写锁
rw.AcquireWriterLock(TimeSpan.FromSeconds(30));
//释放锁
rw.ReleaseWriterLock();
//读锁
rw.AcquireReaderLock(TimeSpan.FromSeconds(30));
//释放锁
rw.ReleaseReaderLock();
今天整理“信号量”的相关知识,其实想想也蛮有趣的,锁,互斥,信号量都可以实现线程同步,在framework里面主要有三种。
<1>:ManualResetEvent
<2>:AutoResetEvent
<3>: Semaphore
一:ManualResetEvent
该对象有两种信号量状态True和False,好奇的我们肯定想知道True和False有什么区别,稍后的例子见分晓,有三个方法值得学习一下。
1:WaitOne
该方法用于阻塞线程,默认是无限期的阻塞,有时我们并不想这样,而是采取超时阻塞的方法,如果超时就放弃阻塞,这样也就避免了无限期
等待的尴尬。
2:Set
手动修改信号量为True,也就是恢复线程执行。
3:ReSet
手动修改信号量为False,暂停线程执行。
二:AutoResetEvent
在VS对象浏览器中,我们发现AutoResetEvent和ManualResetEvent都是继承于EventWaitHandle,所以基本功能是一样的,不过值得注意
的一个区别是WaitOne会改变信号量的值,比如说初始信号量为True,如果WaitOne超时信号量将自动变为False,而ManualResetEvent则不会。
三:Semaphore
这玩意是.net 4.0新增的,用于控制线程的访问数量,默认的构造函数为initialCount和maximumCount,表示默认设置的信号量个数和
最大信号量个数,其实说到底,里面是采用计数器来来分配信号量,当你WaitOne的时候,信号量自减,当Release的时候,信号量自增,然而
当信号量为0的时候,后续的线程就不能拿到WaitOne了,所以必须等待先前的线程通过Release来释放。
暂停学这个