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

标签 c multithreading pthreads

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

现在,这是真的吗?

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

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

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

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

只是想知道有哪些方法可同时用于基本线程和高级线程。

最佳答案

POSIX standard实际上是说只有当 SCHED_FIFOSCHED_RR 调度策略适用于线程阻塞。

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

关于c - POSIX 线程和公平性(信号量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22087146/

相关文章:

java - 如何捕获 Java 中的堆栈溢出并从中恢复?

c - 为什么这个程序通过引用传递参数

java - 重复启动和停止多个线程

c - 动态分配的二维数组

c++ - Solaris 10 x86 C++ 上的 GetThreadTimes

c - 在c中使用posix信号量的读写器应用程序中的段错误

C++正确使用互斥锁

c - pthread_cond_wait 2 个线程

c - 什么情况下time in time.h会失败?

c - 为什么在 C 中声明函数名和函数 block 之间的变量编译为有效?