【问题标题】:POSIX threads and fairness (semaphores)POSIX 线程和公平性(信号量)
【发布时间】:2014-02-28 05:38:03
【问题描述】:

我用 C 语言创建了一个程序,它创建了 2 个缓冲区。缓冲区索引包含单个字符,“A”或“b”等...为了了解有关多线程的更多信息,我创建了一组基于生产者/消费者问题的信号量,以从缓冲区中生成字符并使用字符。每个缓冲区有 3 个生产者线程和 10 个消费者线程。消费者从每个缓冲区中取出一个项目,然后报告它(也释放消费项目的内存)。现在,根据我的阅读, sem_wait() 应该在它退出阻塞状态时发出“最长等待线程”的信号(我在一本书和一个在线 POSIX 库中读到了这个)。

现在,这真的是真的吗?

我创建的应用程序应该让消费者和生产者都在同一个 sem_wait() 门等待,但是生产者进入临界区的时间是任何消费者的两倍多。消费者确实有一个额外的信号量要等待,但这不应该有那么大的区别。我似乎无法弄清楚为什么会这样,所以我希望其他人会这样做。如果我在生产者线程上休眠(1),消费者就可以很好地进入并且缓冲区徘徊在 0 个项目周围......就像我认为否则会发生的那样。

另外,线程创建顺序是否应该在我如何构建程序以实现公平性方面发挥任何作用?

IE,以循环方式生产每种类型的一种,直到每个人都被创建并运行。

有没有任何人可以向我描述的方法来建立一个更公平的线程访问系统?我读过创建 FIFO 队列系统可能是一种解决方案,其中最长等待线程具有最高优先级(这是我认为 sem_wait() 无论如何都会做的)。

只是想知道有哪些方法可以用于初级和更高级别的线程。

【问题讨论】:

    标签: c multithreading pthreads


    【解决方案1】:

    POSIX standard 实际上是说“等待时间最长的最高优先级线程应该被解除阻塞” 只有当SCHED_FIFOSCHED_RR 调度策略适用于阻塞线程时。

    如果您不使用这两个实时调度策略之一,则信号量不必是“公平的”。

    【讨论】:

      【解决方案2】:

      多线程软件只有在以下情况下才有意义

      1. 您可以使用多个核心
      2. 有些算法更容易编程

      你如何定义公平。当然,如果核心无事可做,那么他们承担工作会更好。一个核心永远不被查看有关系吗?

      【讨论】:

      • 在这种情况下,我将 fair 定义为,“与临界区相关的每个线程都获得与相同类型的其他线程相同的使用量。”因此,对于任何绑定到缓冲区的生产者,它们每个都应该生产大约相同数量的项目。对于每个消费者,他们应该消费大致相同数量的物品。此外,绑定到同一临界区的任何不同类型的线程也应遵守此规则。我“认为”这就是我所说的公平。每个线程在做某事时都会受到公平的震动吗?
      • 当你有一个铁锹和两个工人时,这真的很重要吗?两个人都不在乎他们什么时候喝茶或全速工作?
      • “重要”无关紧要。我想创建一个程序,在其中不引起锁步或使线程进入睡眠状态,并且满足上述规则。此外,在这种情况下,无论有多少,消费者的工作似乎都没有生产者那么快。我试图找出原因。编辑:我明白你的意思,但它与我知道“为什么”无关。
      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多