C 信号量队列

C 信号量队列,c,multithreading,blocking,semaphore,system,C,Multithreading,Blocking,Semaphore,System,我正在扩展信号量的功能。当我意识到我不知道实际信号量的实现时,我遇到了一个障碍,为了确保我的代码正确运行,我需要知道这一点 我知道一个信号量的工作原理是当它们调用sem_wait()时阻塞正在等待它的线程,而另一个线程当前已将其锁定。然后阻塞线程,然后将其放入该信号量的等待列表中 我的问题与sem_post()上发生的事情有关。是否将下一个线程从等待列表中拉出,设置为锁定线程,并允许其解锁?或者,发布的方案是否完全不同 谢谢 有两种操作: P() V() 信号量还有一个与之相关联的整数,即允许在

我正在扩展信号量的功能。当我意识到我不知道实际信号量的实现时,我遇到了一个障碍,为了确保我的代码正确运行,我需要知道这一点

我知道一个信号量的工作原理是当它们调用sem_wait()时阻塞正在等待它的线程,而另一个线程当前已将其锁定。然后阻塞线程,然后将其放入该信号量的等待列表中

我的问题与sem_post()上发生的事情有关。是否将下一个线程从等待列表中拉出,设置为锁定线程,并允许其解锁?或者,发布的方案是否完全不同

谢谢

有两种操作:

  • P()
  • V()
  • 信号量还有一个与之相关联的整数,即允许在不阻塞的情况下通过p()的并发线程数。对P()的其他调用将被阻止,直到调用V()以释放斑点为止

    这是信号量的经典定义


    编辑:信号量不保证顺序。他们实际上不必使用队列或其他FIFO结构。当一次只允许一个线程时,当它调用V()时,另一个(可能是随机的)线程将从其P()调用返回并继续。

    要在其

    sem_wait()
    上解除阻止的下一个线程将是操作系统确定的下一个上下文切换到的线程。没有人保证订购;这取决于操作系统的调度策略。它可能是脱离CPU时间最长的线程,或者是被分配了最高“优先级”的线程,或者是历史上具有特定资源使用统计数据的线程,等等

    最有可能的是,您当前的线程(调用
    sem_post()
    )将继续运行一段时间,直到它开始等待用户输入、阻塞另一个信号量或耗尽其操作系统分配的时间片。然后,操作系统将切换到一些完全不相关的进程,运行几秒钟(可能是Firefox之类的),然后关闭并处理一些网络流量,给自己倒杯茶,最后,当它开始运行时,选择它喜欢的其他线程,基于类似于是否感觉基于过去的历史,特定线程更受CPU或I/O的限制


    在许多操作系统中,优先考虑I/O绑定的进程,这些进程已经不存在很长时间了。理论上,新流程可能是短暂的(如果已经运行了5个小时,很可能在未来1分钟内无法完成),因此我们不妨让它们结束。受I/O限制的进程可能会继续受I/O限制,这意味着它们可能会在等待其他资源时很快关闭CPU。基本上,操作系统希望尽快找到它可以完成的进程,这样它就可以继续喝茶并运行你的恶意软件。

    是的,但是当一次只允许通过一个线程时,是否有可能确切地知道信号量的等待队列是如何工作的?信号量不能保证顺序。他们实际上不必使用队列或其他FIFO结构。当一次只允许一个线程时,当它调用V()时,另一个(可能是随机的)线程将从其P()调用返回并继续。@Ben S:为什么不将该注释提升到部分答案?我认为这是HeluimHippet最初追求的,而且说得很清楚。
    信号量不能保证秩序+1您好,当作者使用
    P(orderMutex);//还记得我们的到达顺序吗?
    还有这篇维基百科文章,其中写道“信号:将信号量变量的值增加1。在增加后,如果预增加值为负值(意味着有进程等待资源),它会将阻塞的进程从信号量的等待队列转移到就绪队列”?