【问题标题】:Manipulating thread's nice value操纵线程的好值
【发布时间】:2011-08-23 15:19:14
【问题描述】:

我写了一个实现master/worker方案的简单程序,其中master是主线程,worker是由它创建的。

主线程向共享缓冲区写入内容,工作线程读取该共享缓冲区,对共享缓冲区的写入和读取由读/写锁组织。

不幸的是,这种方案肯定会导致主线程饥饿,因为一次写入必须等待多次读取才能完成。一种可能的解决方案是增加主线程的优先级,因此如果它想写东西,它会立即访问共享缓冲区。

根据great post 的类似问题,我发现可能不允许在SCHED_OTHER 策略下操纵线程的优先级,可以更改的只是nice 值。

我写了一个程序,让工作线程的优先级低于主线程,但它似乎无法正常工作。

void assignWorkerThreadPriority(pthread_t* worker)
{
    struct sched_param* worker_sched_param = (struct sched_param*)malloc(sizeof(struct sched_param));
    worker_sched_param->sched_priority =0; //any value other than 0 gives error?
    int policy = SCHED_OTHER;
    pthread_setschedparam(*worker, policy, worker_sched_param);
    printf("Result of changing priority is: %d - %s\n", errno, strerror(errno));
}

我有两个问题:

  1. 如何设置工作线程的 nice 值以避免主线程饥饿。
  2. 如果不可能,那么如何将调度策略更改为允许更改优先级的策略。

编辑:我设法使用其他策略运行程序,例如SCHED_FIFO,我所要做的就是以超级用户身份运行程序

【问题讨论】:

  • 也许你需要的是读写器对 RW 锁的偏好?看到这个问题:stackoverflow.com/questions/2190090/…
  • 感谢 Alexey 的有用提示,问题是我自己实现了读/写锁,我对这个话题很感兴趣,因为我将来可能会再次需要它
  • 此外,规范说如果pthread_setschedparam() 失败,则返回错误号,并且没有提及errno。所以也许你最好检查返回值是否不是 0。
  • 我确实检查了错误(代码的最后一行),当我使用 SCHED_OTHER 时,它不接受除 0 以外的任何优先级(它抱怨 EINVAL 错误)。我确实正确使用了SCHED_FIFO(我只需要以超级用户身份运行程序)并根据需要设置优先级,但它并不影响程序执行!
  • 需要在线程上设置优先级(或“好值”)通常表明存在更大的设计问题。

标签: c multithreading pthreads nice


【解决方案1】:

无法避免在读写使用如此均匀的情况下使用读/写锁出现问题。你需要一种不同的方法。您需要无锁消息队列或独立工作队列或许多其他技术之一。

这是完成这项工作的另一种方式,我会这样做。工作人员可以拿走缓冲区并对其进行处理,而不是保持共享:

  • 写线程:
    • 创建工作项。
    • 锁定保护当前队列和队列指针的互斥体或关键部分。
    • 将工作项添加到队列中。
    • 释放锁。
    • 可选地向条件变量或事件发出信号。另一种选择是让工作线程检查计时器上的工作。
  • 工作线程:
    • 创建一个新队列。
    • 等待条件变量或事件或其他信号,或等待计时器。
    • 锁定保护当前队列和队列指针的互斥体或关键部分。
    • 将当前队列指针设置为新队列。
    • 释放锁。
    • 继续处理现在的私有队列。
    • 在所有工作项完成后删除队列。
  • 现在写入线程会创建更多工作项。当所有工作线程都有自己的队列副本可以处理时,它将能够安静地写入许多项目。

您可以修改它。例如,一个工作线程可能会锁定队列并将有限数量的工作项移到它自己的内部队列中,而不是占用整个队列。

【讨论】:

  • 我认为这种技术由于多个队列复制操作而涉及大量内存开销并因此浪费 CPU 周期,但这当然取决于工作线程是否是计算受限的。我认为给 writer 线程更高的优先级,以便在 writer 准备好时可以抢占 reader 是一个更简单的解决方案。
  • @H.Josef:我猜我的第一段在其余部分中丢失了。当您的读/写使用率接近 50/50 时,使用读/写锁是错误的。就像你在这种情况下所做的那样。
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2012-09-09
  • 2014-01-07
  • 2017-09-02
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多