首页 文章

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

提问于
浏览
1

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

现在,这是真的吗?

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

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

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

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

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

2 回答

  • 3

    仅当 SCHED_FIFOSCHED_RR 调度策略应用于被阻止的线程时,POSIX standard实际上才会说"the highest priority thread that has been waiting the longest shall be unblocked" .

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

  • 0

    多线程软件才有意义

    • 你有多个核心可以使用

    • 有些算法更容易编程

    你如何定义公平 . 当然,如果核心无所事事,那么它们就更好了 . 如果一个核心永远不会看起来重要吗?

相关问题