2012-08-16 33 views
0

假设我有一个共享对象,其中有一段代码受关键部分保护,并且有多个线程正在访问该对象以进行读取/写入。当线程在临界区内时,其他线程正在等待。线程一旦离开CS,操作系统就可以访问任何等待的线程。使用互斥锁守护关键部分

如果我仅限于一个进程,那么CS本身是否能够很好地保护共享对象?

我问,因为我已经看到了网络,正确的方式做它是使用一个内核对象(例如:互斥,semaphone)看守CS。希望使用共享资源的线程需要首先使用WaitForSingleObject类型的函数获取互斥/信号量。如果使用互斥锁,那么只有一个可以访问资源。一旦获得互斥体,线程进入CS,完成应该做的事情,然后离开CS并释放互斥体。然后操作系统允许任何其他等待线程获取互斥锁等等。

但是是不是只使用CS相同?

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

有没有其他理由为什么这种方法更好? 在此先感谢

+0

是否应该将其移至[计算机科学](http://cs.stackexchange.com/)? – Greg 2012-08-16 20:21:37

+0

我从来没有见过任何代码能够完成您所说的所见过的任何代码。你可以指向一些获得互斥锁或sempahore的代码,然后获得具有相同范围的关键部分吗?我怀疑你可能会误解或误解那些代码,这就是你混淆的根源。 (也可能你混淆了术语“临界区”的两种不同用法,一种意思是特定的同步原语,另一种意思是代码区域受类似互斥体同步保护的代码区域) – 2012-08-16 20:24:08

+0

谢谢大卫,我的意思是CSection窗口结构(InitializeCS,EnterCS,LeaveCS,DeleteCS)。难道是我误解了我读的东西? – user1599391 2012-08-16 20:57:33

回答

2

这听起来像你正在讨论一些特定于Windows的术语,使它与一些通用的计算机科学术语混杂在一起。

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

在计算机科学中,术语“互斥”通常用于描述可用于提供执行的并行或cncurrent线程之间同步的对象。在Windows中,还有一个互斥对象,可以使用CreateMutex()函数创建互斥对象(该对象返回表示互斥锁的HANDLE)。该对象可以用于在相同或不同进程中的线程之间同步访问,因此它可以以类似于CRITICAL_SECTION(但使用不同的API)的方式在很多方面使用。如果要同步处于不同进程中的执行线程,可以使用互斥对象,而对象不能。所以要回答你的问题(我认为),如果你只关心保护作为同一过程一部分的线程中的关键部分,则应该是足够的。一个互斥对象可以用来代替,但它的性能可能会稍差一些。应该不需要使用这两种类型的对象