2014-02-28 93 views
0

我在C中创建了一个程序,创建了2个缓冲区。缓冲区索引包含单个字符'A'或'b'等......为了更多地了解多线程,我创建了一组基于生产者/消费者问题的信号量来生成字符并从缓冲区中消耗字符。我有3个生产者线程为每个缓冲区和10个消费者线程。消费者从每个缓冲区中取一个项目,然后报告(也释放消耗项目的内存)。现在,从我读过的内容来看,sem_wait()应该表示出现阻塞状态时的“最长等待线程”(我在一本书和在线的POSIX库中阅读了这篇文章)。POSIX线程和公平(信号量)

现在,这是真的吗?

我所做的应用程序应该让消费者和生产者都在同一个sem_wait()门口等待,但生产者进入关键部分的时间是任何消费者的两倍多。消费者确实有一个额外的信号量可以等待,但这不应该产生巨大的差异。我似乎无法弄清楚为什么会发生这种情况,所以我希望别人也这么做。如果我在生产者线程上睡觉(1),那么消费者就会进入正常状态,并且缓冲区在0项左右徘徊......就像我认为会发生的情况一样。

此外,如果线程创建顺序在我如何为公平构造程序中扮演任何角色?

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

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

只是想知道什么方法是基本和更高级别的线程。当

  1. 你有多个内核与
  2. 一些算法更容易发挥编程

你如何定义公平

回答

3

POSIX standard居然说“已等待时间最长的最高优先级的线程应畅通”只有当SCHED_FIFOSCHED_RR调度策略适用于阻塞线程。

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

0

多线程软件才有意义。当然,如果一个核心无所事事,那么他们承担这项工作肯定会更好。如果一个核心从来没有看到过,它有关系吗?

+0

我会在这种情况下定义fair,因为“绑定到关键部分的每个线程都获得与其他相同类型的线程相同的使用量。”因此,对于任何与缓冲区绑定的生产者,他们都应该生产大致相同数量的物品。对于每个消费者,他们应该消费大致相同数量的物品。此外,绑定到同一临界区的任何不同类型的线程也应该遵循此规则。我“认为”这就是我所说的公平。每个线程在做某件事情时都会得到公平的动摇吗? – user2079828

+0

当你有一个铲子和两个工人时,这真的很重要吗?两人都不在乎什么时候喝茶或者全身都在工作? –

+0

“Mattering”无关紧要。我想创建一个程序,在这个程序中,在不引入锁步或将线程挂起的情况下,满足上面的规则。此外,在这种情况下,消费者似乎没有生产者那么快,不管有多少。我试图找出原因。编辑:我明白你的意思,但它与我知道“为什么”无关。 – user2079828