繁体   English   中英

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

[英]POSIX threads and fairness (semaphores)

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

现在,这真的是真的吗?

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

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

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

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

只是想知道基本线程和更高级别线程都有哪些方法。

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

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

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

  1. 你有多个核心可以玩
  2. 一些算法更容易编程

你怎么定义公平。 当然,如果核心无所事事,那么他们就可以承担工作更好。 如果一个核心永远不会被查看是否重要?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM