0

假设我有一个共享对象,它的一段代码受临界区保护,并且有多个线程正在访问该对象以进行读/写。当一个线程在临界区内时,其他线程正在等待。一旦线程离开 CS,操作系统就会允许访问任何等待的线程。

如果我仅限于一个进程,那么单独使用 CS 是否可以很好地保护共享对象?

我问是因为我在网上看到正确的方法是使用内核对象(例如:互斥锁、信号机)来保护 CS。希望使用共享资源的线程需要首先使用 WaitForSingleObject 类型的函数获取互斥体/信号量。如果使用互斥体,则只有其中一个可以访问资源。一旦获得互斥锁,线程就会进入 CS,做应该做的事情,然后离开 CS 并释放互斥锁。然后操作系统允许任何其他等待线程获取互斥锁等等。

但是不就和只使用 CS 一样吗?

此外,使用互斥锁应该比单独使用 CS 慢得多。我看到的仅使用 CS 的唯一问题是,如果线程在 CS 内崩溃,那么其他线程可能永远不会访问共享资源。

还有什么其他原因可以说明这种方法更好吗?提前致谢

4

1 回答 1

2

听起来您在讨论某些特定于 Windows 的术语时,会将其与某些通用计算机科学术语混为一谈。

在计算机科学中,术语“关键部分”用于必须专门运行的代码区域(通常是由于数据共享)。在 Windows 中,有一个称为同步对象CRITICAL_SECTION,可用于提供对执行区域的独占访问。Windows 上对象的另一个属性CRITICAL_SECTION是它仅限于在单个进程中使用。

在计算机科学中,术语“互斥锁”通常用于描述可用于在并行或当前执行线程之间提供同步的对象。在 Windows 中,还有一个可以使用CreateMutex()函数创建的互斥对象(它返回一个HANDLE表示互斥的)。该对象可用于在相同或不同进程中的线程之间同步访问,因此可以CRITICAL_SECTION在许多方面类似于 a(但具有不同的 API)来使用它。如果要同步不同进程中的执行线程,可以使用互斥对象,而CRITICAL_SECTION对象不能。

因此,要回答您的问题(我认为),如果您只关心保护属于同一进程的线程之间的关键部分,那么CRITICAL_SECTION对象应该就足够了。可以改用互斥对象,但它的性能可能会稍差一些。不需要同时使用这两种类型的对象

于 2012-08-16T21:02:59.887 回答