线程的同步

转载 2012年03月27日 14:54:47

在C#中实现线程的同步有几种方法:lock、Mutex、Monitor、Semaphore、Interlocked和ReaderWriterLock等。

1.lock同步

2.Monitor类
针对上面的代码,如果使用Monitor类来同步的话,互斥同步,使用如下

实际上是相当于:

我们知道在绝大多数情况下finally中的代码块一定会被执行,这样确保了即使同步代码出现了异常也仍能释放同步锁。
Monitor类出了Enter()和Exit()方法之外,还有Wait()和Pulse()方法。

Wait()方法是临时释放当前活得的锁,并使当前对象处于阻塞状态,

Pulse()方法是通知处于等待状态的对象可以准备就绪了,它一会就会释放锁。

3.ReaderWriterLock
ReaderWriterLock支持单个写线程和多个读线程的锁。在任一特定时刻允许多个线程同时进行读操作或者一个线程进行写操作,使用ReaderWriterLock来进行读写同步比使用监视的方式(如Monitor)效率要高。

AcquireReaderLock(TimeSpan),超时值读线程锁,ReleaseReaderLock()减少读锁计数器,释放锁

AcquireWriterLock(TimeSpan)超时值写线程锁,ReleaseWriterLock()减少写锁计数器,释放锁

 

WaitHandle
WaitHandle类是一个抽线类,有多个类直接或者间接继承自WaitHandle类,类图如下:
 
在WaitHandle类中SignalAndWait、WaitAll、WaitAny及WaitOne这几个方法都有重载形式,其中除WaitOne之外都是静态的。WaitHandle方法常用作同步对象的基类。WaitHandle对象通知其他的线程它需要对资源排他性的访问,其他的线程必须等待,直到WaitHandle不再使用资源和等待句柄没有被使用。
WaitHandle方法有多个Wait的方法,这些方法的区别如下:
WaitAll:等待指定数组中的所有元素收到信号。
WaitAny:等待指定数组中的任一元素收到信号。
WaitOne:当在派生类中重写时,阻塞当前线程,直到当前的 WaitHandle 收到信号。
这些wait方法阻塞线程直到一个或者更多的同步对象收到信号。
下面的是一个MSDN中的例子,讲的是一个计算过程,最终的计算结果为第一项+第二项+第三项,在计算第一、二、三项时需要使用基数来进行计算。在代码中使用了线程池也就是ThreadPool来操作,这里面涉及到计算的顺序的先后问题,通过WaitHandle及其子类可以很好地解决这个问题。
代码如下:

程序的运行结果如下:
Result = 0.355650523270459.
Result = 0.125205692112756.



 

线程同步和线程安全

线程同步 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。 “同”字从字面上容易理解为一起动作 其实不是,“同”字应是指协同、协助、互相配合。 如进程、线程同步...
  • u012320991
  • u012320991
  • 2016年02月21日 15:18
  • 2337

线程同步(5种同步方式)

为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该...
  • cengjingyige
  • cengjingyige
  • 2016年08月31日 10:17
  • 4169

线程同步的几种方式

多个线程同时访问共享数据可能会冲突。比如两个线程同时把某个全局变量增加1需要3步。1.从内存读取变量到寄存器 2.把寄存器中变量值加一 3.把结果返回给内存 不同线程的执行时间会造成结果的不...
  • qq_35116353
  • qq_35116353
  • 2017年07月29日 14:24
  • 751

java线程安全,同步,异步

线程是比进程更小的执行单位,是在进程基础上进行的进一步划分。所谓多线程是指进程在执行过程中可以产生多个同时存在、同时运行的线程。多进程机制可以合理利用资源,提高程序的运行效率。一个进程至少包含一个线程...
  • Java_Zhangchao
  • Java_Zhangchao
  • 2016年08月09日 12:44
  • 1514

关于线程同步的几种方法

java允许多线程,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),  将会导致数据不准确,相互之间产生冲突。  比方说,我们在买火车票的时候,如何能确定余票数据准确...
  • zhouzhe1991617
  • zhouzhe1991617
  • 2017年02月08日 11:49
  • 951

线程同步的几种方式

 ---------------------用户模式下的同步对象---------------------- ----------1、 临界区(CCriticalSection)-------...
  • u011200925
  • u011200925
  • 2017年02月17日 17:47
  • 1653

线程安全和线程同步Synchronized

线程不安全的产生和线程同步,volatile的使用仍然留有疑问
  • camlot_
  • camlot_
  • 2016年07月23日 15:50
  • 6695

线程如何实现同步和通讯

线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。 实现同步机制有两...
  • gjb270806922
  • gjb270806922
  • 2016年11月25日 19:59
  • 2420

线程同步的几种方法的总结

线程同步的方式包括:互斥锁、读写锁、条件变量、信号量和令牌。 互斥锁和读写锁:提供对临界资源的保护,当多线程试图访问临界资源时,都必须通过获取锁的方式来访问临界资源。(临界资源:是被多线程共...
  • liujianfei526
  • liujianfei526
  • 2016年09月07日 10:34
  • 3101

进程同步和线程同步

怎样同步多个线程或多个进程的活动。为允许在线程或进程间共享数据,同步是必需的。          互斥锁和条件变量是同步的基本组成部分。互斥锁和条件变量出自POSIX.1线程标准,它们总是可用来同步一...
  • u013074465
  • u013074465
  • 2015年05月30日 09:53
  • 3296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程的同步
举报原因:
原因补充:

(最多只允许输入30个字)