POSIX线程和公平性(信号量)

时间:2014-02-28 05:38:04

标签: c multithreading pthreads

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

现在,这是真的吗?

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

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

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

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

只是想知道哪些方法适用于基本线程和更高级别的线程。

2 个答案:

答案 0 :(得分:3)

POSIX standard实际上只有在SCHED_FIFOSCHED_RR调度策略时,“等待时间最长的最高优先级线程才会被取消阻止”适用于被阻止的线程。

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

答案 1 :(得分:0)

多线程软件只有在

时才有意义
  1. 您可以使用多个核心
  2. 有些算法更容易编程
  3. 你如何定义公平。当然,如果核心无所事事,那么它们就更好了。如果一个核心永远不会看起来重要吗?