【发布时间】:2012-08-16 20:15:15
【问题描述】:
假设我有一个共享对象,其中有一段代码受临界区保护,并且有多个线程正在访问该对象以进行读/写。当一个线程在临界区内时,其他线程正在等待。一旦线程退出 CS,操作系统就会允许访问任何等待的线程。
如果我仅限于一个进程,单独的CS是否对共享对象有很好的保护?
我问是因为我在网上看到正确的做法是使用内核对象(例如:互斥锁、信号机)来保护 CS。希望使用共享资源的线程需要首先使用 WaitForSingleObject 类型的函数获取互斥体/信号量。如果使用互斥体,则只有其中一个可以访问资源。一旦获得互斥锁,线程就会进入 CS,做应该做的事情,然后离开 CS 并释放互斥锁。然后操作系统允许任何其他等待线程获取互斥锁等等。
但不是和只使用 CS 一样吗?
此外,使用互斥锁应该比单独使用 CS 慢得多。我看到的仅使用 CS 的唯一问题是,如果线程在 CS 内部崩溃,那么其他线程可能永远无法访问共享资源。
还有什么其他原因可以说明这种方法更好吗? 提前谢谢
【问题讨论】:
-
这个应该转移到Computer Science吗?
-
我从未见过任何代码可以按照您所说的那样做。你能指出一些获取互斥量或信号量然后获取具有相同范围的临界区的代码吗?我怀疑您可能只是误读或误解了该代码,这就是您困惑的根源。 (您也可能会混淆术语“临界区”的两种不同用法。一种表示特定的同步原语,另一种表示受互斥锁同步保护的代码区域。)
-
谢谢david,我指的是CSection窗口结构(InitializeCS、EnterCS、LeaveCS、DeleteCS)。会不会是我误解了我读到的内容?
-
Windows CriticalSection 是一个进程绑定的互斥体。它在一个过程中运行良好。不需要任何进一步的保护。
标签: multithreading critical-section