【问题标题】:Can Semaphore cause race condition?信号量会导致竞争条件吗?
【发布时间】:2021-09-03 17:16:29
【问题描述】:

我是一名学生,目前正在研究操作系统的并发——信号量。 我阅读有关信号量、互斥量和信号量的书籍和文章......但似乎无法回答标题的条件。


存在一个信号量,信号量可以用作“二进制信号量”和“计数信号量”,按初始值分类。 我了解二进制信号量可以通过与互斥锁类似的行为来防止竞争条件(但由于各种原因,两者并不相同。

我比较好奇的是,当我们初始化大于等于2的信号量值,比如说n,那么n个值就可以进入临界会话。那么这种信号量的使用会导致竞争条件吗?

我阅读了有关计数信号量的文章,并且认为它们被认为是跟踪对资源的访问,我对此感到困惑 难道我们不是这样使用counting semaphore吗,不是用来解决并发问题的counting semaphore吗?


添加在下面是因为我的问题不详细。

例如,当有100个线程时,我初始化X=10,然后用sem_init(&s, 0, X)初始化信号量,如果线程的代码流中有一个关键会话,那么它不会因为10而导致竞争条件是否允许线程使用资源并通过线程的流程?

【问题讨论】:

  • 你不需要说“如果这是一个不好的问题,我会删除它。”事实上,每个人都会犯错误。 秘密:我问了太多不好的问题。一个不好的问题不会给你惹麻烦。
  • CS StackExchange 将是解决此类问题的更好地方
  • @Someone_who_likes_SE 。我编辑了那行。谢谢!

标签: semaphore


【解决方案1】:

信号量可以防止竞争条件。计数信号量用于它们控制的资源有多个可用实例。

如果他们控制对单个资源的访问,则将使用互斥信号量。如果有两个资源可以使用,那么将使用两个计数信号量。如果有 3 个,则信号量为 3,依此类推。

【讨论】:

    【解决方案2】:

    我比较好奇的是,当我们初始化大于等于2的信号量值,比如说n,那么n个值就可以进入临界会话。那么这种信号量的使用会导致竞争条件吗?

    你说的是一个计数信号量,它通常被初始化为 0。我实际上想不出你想要将它初始化为一个值 >0 的用例,因为每个等待的线程/任务都会导致计数只要它在等待,信号量就会增加。而且增量是原子指令,不会引起并发问题。

    【讨论】:

    • 我应该在主上下文中写这个..我会编辑并添加它。例如,当有100个线程时,我初始化X = 10,然后用sem_init( &s, 0, X),如果线程的代码流中存在关键会话,那么它不会因为允许 10 个线程使用资源并通过线程的流而导致竞争条件吗?这不会用于计算信号量,也不会有这种用例..但理论上,我认为它可能会发生..如果没有,那么我将不得不搜索和研究更多关于这个主题。谢谢你的答复! ——
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多