操纵线程的好价值

时间:2011-05-11 20:32:38

标签: c multithreading pthreads nice

我写了一个简单的程序来实现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. 如果不可能,那么如何将调度策略更改为允许更改优先级的策略。

  3. 编辑:我设法使用其他政策运行程序,例如SCHED_FIFO,所有我必须做的就是以超级用户身份运行程序

1 个答案:

答案 0 :(得分:1)

当读取和写入使用情况均匀时, 无法避免使用读/写锁定的问题。你需要一个不同的方法。您需要一个无锁消息队列或独立工作队列或许多其他技术之一。

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

  • 写线程:
    • 创建工作项。
    • 锁定保护当前队列和指向队列的指针的互斥锁或CriticalSection。
    • 将工作项添加到队列。
    • 解锁。
    • 可选择发出条件变量或事件信号。另一个选择是工作线程检查计时器的工作。
  • 工作人员主题:
    • 创建新队列。
    • 等待条件变量或事件或其他信号,或等待计时器。
    • 锁定保护当前队列和指向队列的指针的互斥锁或CriticalSection。
    • 将当前队列指针设置为新队列。
    • 解锁。
    • 继续处理现在的私人队列。
    • 完成所有工作项后删除队列。
  • 现在写线程会创建更多工作项。当所有工作线程都拥有自己的队列副本时,它就可以安心地编写许多项目。

你可以修改它。例如,工作线程可以锁定队列并将有限数量的工作项移动到其自己的内部队列中,而不是完成所有工作。