什么是线程中的关键部分
Posted
技术标签:
【中文标题】什么是线程中的关键部分【英文标题】:What are Critical sections in threads 【发布时间】:2012-05-14 10:31:37 【问题描述】:我正在阅读有关互斥锁、信号量和临界区的信息。我知道互斥锁会同步资源,以便一次只有一个线程访问它,信号量允许特定数量的线程访问资源,但关键部分做什么??
【问题讨论】:
您是在谈论 Windows,还是泛泛而谈? 阅读这个 - en.wikipedia.org/wiki/Critical_section,如果仍然没有意义,然后再回来提出一个更具体的问题。 在我看来,从阅读那篇***文章来看,信号量和临界区是相同的? 不,他们不是。一般来说,信号量是有计数的。确实,初始化为 1 的信号量可用于控制临界区,但仍然存在差异 - Windows 临界区不能用于进程间同步,但在用于线程间同步。 CS 允许递归锁定,初始化为 1 的信号量不允许。 【参考方案1】:在正常使用中,临界区是必须串行执行的一段代码——即在任何给定时间只有一个线程可以执行该代码。您通常通过使用互斥信号量保护代码来实现这一点。
在 Windows 的用语中,临界区是一种数据结构(以及一些相关的函数),它在特定于进程的互斥信号量中实现(即,仅用于在单个进程中的线程之间锁定,而不是在单独的进程之间锁定) .
信号量有两种。互斥信号量一次只允许一个线程执行。计数信号量允许您指定可以同时执行的最大线程数。互斥信号量是更常见的品种,但计数信号量肯定也有用途。
【讨论】:
“互斥信号量”是否与“二进制信号量”相同(有相关的SO question)?术语有时会令人困惑。 不,两者并不完全相同。锁定的互斥锁只能由之前锁定它的人解锁。任何人都可以解锁锁定的二进制信号量。 谢谢,有道理。但是,这会让我相信信号量分为三种? (抱歉吹毛求疵)。 @JesseGood:根据您想要了解的详细程度,还有更多——例如,一些互斥锁是“递归的”,这意味着同一个线程可以重复声明所有权,并保留直到它释放所有权的次数相同。如果线程尝试获得两次所有权,其他互斥锁会死锁。以上是关于什么是线程中的关键部分的主要内容,如果未能解决你的问题,请参考以下文章