C# Mutex,Event,Semaphore,Critical Section这四个有什么区别呢?
[已解决] C# Mutex,Event,Semaphore,Critical Section这四个有什么区别呢?
当前页面:http://www.senparc.com/SZD-153
{ 收藏当前页面 }
最佳答案
有几个版本的解释,意思大致是一样的:
1、查看http://msdn.microsoft.com/en-us/library/ms686364(VS.85).aspx
Event Notifies one or more waiting threads that an event has occurred. For more information, see Event Objects.
Mutex Can be owned by only one thread at a time, enabling threads to coordinate mutually exclusive access to a shared resource. For more information, see Mutex Objects.
Semaphore Maintains a count between zero and some maximum value, limiting the number of threads that are simultaneously accessing a shared resource. For more information, see Semaphore Objects.
Waitable timer Notifies one or more waiting threads that a specified time has arrived. For more information, see Waitable Timer Objects.
2、
Event分自动和手动两种,手动Event得到信号时,所有等待该事件的线程都将进入可调度状态,自动Event得到信号时,只有一个等待该事件的线程进入可调度状态。
Mutex每次只有一个线程得到信号,Mutex的内部维护一个线程id,用于标识系统中的哪个线程当前拥有该Mutex对象,与其他的内和对象不同即使Mutex处于没有信号的状态,只要该线程的ID与Mutex维护的ID相同,该线程就可以保持可调度状态。
Semaphore不同于其他内核对象的的地方是他有一个可用资源计数的功能。
Critical Section不同于前面所提到的三种,他们都是内核对象,是在内核方式下实现同步的,而Critical Section则是在用户方式下实现的同步的,效率比前面的三种都要高;另外Critical Section是不能跨进程使用的。
3、
事件(Event)是WIN32提供的最灵活的线程间的同步方式,事件可处于激发状态或未激发状态。根据状态变迁方式的不同,事件分为手动设置和自动恢复两类。
互斥量(Mutex)跟临界区很相似,只有拥有胡扯对象的线程才具有访问资源的权限。互斥量又比临界区复杂,运行速度也比较慢,因为使用互斥量不仅能够在同一个应用程序不同线程中实现资源的安全共享,还可以在不同应用程序的线程间实现对资源的安全共享。
信号量(Senmaphores)对象对线程的同步方式与前面几种方法不同,信号量允许多个线程同时使用共享资源。信号量的值我们可以认为是可以同时访问贡献资源的线程最大数目,或者可以理解为可以共享使用的某一类资源的数目。
临界区(CriticalSection)在任意时刻只允许一个线程对共享资源进行访问。临界区不是OS核心对象,如果进入理解去的线程“挂”了,将无法释放临界资源,这个缺点在互斥量中得到了弥补,因为使用互斥量可以设置超时值。
1、查看http://msdn.microsoft.com/en-us/library/ms686364(VS.85).aspx
Event Notifies one or more waiting threads that an event has occurred. For more information, see Event Objects.
Mutex Can be owned by only one thread at a time, enabling threads to coordinate mutually exclusive access to a shared resource. For more information, see Mutex Objects.
Semaphore Maintains a count between zero and some maximum value, limiting the number of threads that are simultaneously accessing a shared resource. For more information, see Semaphore Objects.
Waitable timer Notifies one or more waiting threads that a specified time has arrived. For more information, see Waitable Timer Objects.
2、
Event分自动和手动两种,手动Event得到信号时,所有等待该事件的线程都将进入可调度状态,自动Event得到信号时,只有一个等待该事件的线程进入可调度状态。
Mutex每次只有一个线程得到信号,Mutex的内部维护一个线程id,用于标识系统中的哪个线程当前拥有该Mutex对象,与其他的内和对象不同即使Mutex处于没有信号的状态,只要该线程的ID与Mutex维护的ID相同,该线程就可以保持可调度状态。
Semaphore不同于其他内核对象的的地方是他有一个可用资源计数的功能。
Critical Section不同于前面所提到的三种,他们都是内核对象,是在内核方式下实现同步的,而Critical Section则是在用户方式下实现的同步的,效率比前面的三种都要高;另外Critical Section是不能跨进程使用的。
3、
事件(Event)是WIN32提供的最灵活的线程间的同步方式,事件可处于激发状态或未激发状态。根据状态变迁方式的不同,事件分为手动设置和自动恢复两类。
互斥量(Mutex)跟临界区很相似,只有拥有胡扯对象的线程才具有访问资源的权限。互斥量又比临界区复杂,运行速度也比较慢,因为使用互斥量不仅能够在同一个应用程序不同线程中实现资源的安全共享,还可以在不同应用程序的线程间实现对资源的安全共享。
信号量(Senmaphores)对象对线程的同步方式与前面几种方法不同,信号量允许多个线程同时使用共享资源。信号量的值我们可以认为是可以同时访问贡献资源的线程最大数目,或者可以理解为可以共享使用的某一类资源的数目。
临界区(CriticalSection)在任意时刻只允许一个线程对共享资源进行访问。临界区不是OS核心对象,如果进入理解去的线程“挂”了,将无法释放临界资源,这个缺点在互斥量中得到了弥补,因为使用互斥量可以设置超时值。
回答时间:2010/7/16 15:25:33
| 回答者:GaLiJiKuai
其他参考答案(0)
提交失败!请检查错误!错误信息:
以下信息或许对您有用:
- [已解决] 5 ArrayList或者HashTable支持序列化和反序列化吗? 2010/9/9 23:12:41
- [已解决] 5 JSON.Net的SerializeObject可以处理List数据吗? 2010/9/9 23:05:22
- [已解决] 10 在VS2010中装Silverlight tools 4出错 2010/8/13 8:40:43
- [已解决] 5 C#中如何取余数? 2010/8/3 18:39:49
- [已解决] 10 C#中委托能不能序列化?WCF中需要传递委托! 2010/7/31 11:09:43