【问题标题】:Using semaphores to prevent race conditions (in C)使用信号量来防止竞争条件(在 C 中)
【发布时间】:2012-05-01 16:15:23
【问题描述】:

所以,这是一个非常简单的问题。我正在尝试使用信号量来防止竞争条件。我尝试阅读手册页,但它们确实令人困惑。有人可以简单解释一下它们的工作原理吗?

【问题讨论】:

  • 以下线程中有一个很好的类比。 stackoverflow.com/questions/34519/what-is-a-semaphore
  • 如果您还没有并行编程的经验,请不要使用信号量。从手册页可以看出,它们是可中断的,这使得它们很难在应用程序代码中使用。请改用互斥锁、条件变量或读写锁。

标签: c semaphore


【解决方案1】:

我假设您在 Linux/Unix 中使用。 信号量用于控制/限制从多个线程对共享资源(比如说全局变量)的访问。 一个线程可以获取信号量,修改值并释放它 如果另一个线程试图访问该变量,它应该获取信号量,如果它已经被获取,它会被挂起并在前一个线程放弃控制后获得访问权。

这种方式信号量用于操作的排序和变量的完整性。

信号量也用于从一个线程向另一个线程发送事件信号。 互斥量是信号量的变体,同一线程获取并释放它(以保护临界区或竞争条件)

在下面阅读更多详细信息

https://www.sao.ru/hq/sts/linux/doc/ipc_guide/semaphores.html

【讨论】:

  • Subbul 提供了很好的参考。 Advanced Unix Programming 中的 Marc Rochkind 评论说,信号量可能是 Unix 中最难使用的东西之一。当我使用它们时,我坚持使用单个类似 Dijkstra 的信号量,而不是利用 Unix 信号量的全部复杂性。
  • 答案中的链接已失效。可以在sao.ru/hq/sts/linux/doc/ipc_guide/semaphores.html 上找到相同的页面
【解决方案2】:

我目前正在我的 Systems II 课程中讨论这个主题,该课程基本上使用 C 语言进行编程。正如我的导师向我们解释的那样,信号量是一个非负整数同步变量,它本质上有助于控制某些线程函数。它的工作原理有点像 pthread_mutex 函数,它试图在你的代码中保持线程受到监管......嗯 - 是的,我知道它有点晦涩,但总括的信号量用于调节线程活动,尤其是在使用相对较小的缓冲区时.希望我没有让你更困惑 (0_0)。

我的意思的几个例子:

--信号量:非负整数同步变量。

• sem_wait(s): [ while(s==0) wait(); s--; ] – 最初命名为 P(),荷兰语为“Proberen”(测试)

• sem_post(s): [ s++; ]

– 原名 V(),荷兰语为“Verhogen” (增量)

– OS 保证括号之间的操作 [ ] 是不可分割地执行的。

致谢/引文:Dr. Phillips, Joseph,德保罗大学,讲座(2014 年)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多