【问题标题】:Semaphore/Critial section implementation信号量/关键部分实现
【发布时间】:2020-06-22 09:26:48
【问题描述】:

我正在尝试了解互斥锁、信号量和临界区,但我对信号量的一些事情不确定。信号量与临界区相同吗? semaphore.h 中关于如何使用信号量的定义说明了用途:

sem_t m;
sem_init(&m, 0, X); // initialize semaphore to X; what should X be?

sem_wait(&m);
// critical section here
sem_post(&m);

所以我的问题真的是“//这里的关键部分”实际上是一个关键部分吗?

【问题讨论】:

  • Semaphore 是一把螺丝刀,可让您构建额外的同步结构。像互斥锁或临界区。后者需要一个二进制信号量,X=1。

标签: semaphore critical-section


【解决方案1】:

信号量是用于保护关键部分的工具:确保一次只执行一个 CS。

在您的示例中,执行sem_wait(&m) 的第一个进程将执行其关键部分的副本;任何其他尝试执行其对应的sem_wait 的进程都将被阻止,直到第一个进程通过执行sem_post 完成其CS。此时,对sem_wait 的其他调用将返回,重新开始该过程。

【讨论】:

  • 好吧,可以肯定的是,如果我有一个使用 std::cout 的函数,如果我将 sem_wait() 和 sem_post() 放在 cout 周围,它会成为临界区吗?
  • 非常感谢,我想我现在明白了
  • 你的因果关系倒退了:一段代码是关键部分因为它需要单线程执行,而信号量是实现它的一种方式。在信号量调用中包装一些代码会导致它以单线程方式运行,但没有必要这样做。
  • 不,我想我明白了,因为我想让我的 cout 函数成为临界区,因为两个线程同时使用它,所以我可以通过用 sem_wait 包围 cout 来实现临界区sem_post。对吗?
  • 这更像!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2011-07-23
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多