互斥和事件之间的区别

Mutex vs Event

在C#中,有许多不同的线程同步选项。更广泛使用的两个是互斥和事件。这两者究竟有什么区别?哪一个是更好的选择?

事件选项能够为线程提供阻止选项,直到事件被广播,因此名称为“事件”。这与将某些东西置于睡眠状态相同,只有在发生某些重要事件时才将其唤醒。事件与互斥锁不同,因为互斥锁没有信号选项或功能。一旦能够等待的人被唤醒,事件就能够清除信号。甚至API也能够允许该选项阻塞,直到发出一个或所有不同事件的信号。此外,事件是内核对象。与互斥体相比,它们不“轻”。事件基本上是具有两个状态的内核对象。通常,事件表示事件的发生,有时甚至是I / O操作的结束。

“Mutex”代表互斥。它是共享资源的范围协调机制的一种形式。将其视为一种交易形式。虽然您想要访问一些共享资源(仅在其他人已经访问过它的实例中),但您没有义务等待。互斥体由两个状态组成,但存在实现互斥的情况。这适用于您希望保护一段代码,这些代码通常将共享资源从声明互斥锁的部分更新为将要释放它的部分。这导致没有其他线程可以通过该部分的事实。

试图在互斥体的帮助下模拟事件的人必须遇到这样的问题,即一旦获得锁定或事件被发出信号,该人就会保持其他人的一切,直到锁定被释放。这不是发出信号的事件的语义。在没有任何锁定的情况下,事件可以保持发布并且所有线程测试都可以使用门形式。 Mutex致力于进程间同步是在内核模式对象中。在一种方法下进行多线程同步的事件在用户模式对象中。

互斥对象太重而且太笼统。事件对象要轻得多。在大多数情况下使用用户模式同步,因为它提供较少的CPU周期。 Mutex非常像一个关键部分,用于同步对共享资源的访问。事件具有完全不同的功能,因为它们用于同步任务或管理某些人的任务调度。

事件更像是一个条件变量,不像Mutex,它更像是一个 监视某些术语,或者它可以是信号量/互斥量的传统形式。

摘要:

1.事件选项能够为线程提供阻止选项,直到事件被广播,因此名称为“事件”。

2.事件基本上是具有两种状态的内核对象。通常,事件表示事件的发生,有时甚至是I / O操作的结束。

3.“Mutex”代表互斥。它是共享资源的范围协调机制的一种形式。

4.Mutex致力于进程间同步是在内核模式对象中。在一种方法下进行多线程同步的事件在用户模式对象中。

5.事件更像是一个条件变量,不像Mutex,更像是一个 监视某些术语,或者它可以是信号量/互斥量的传统形式。