【发布时间】: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));
}
我有两个问题:
- 如何设置工作线程的 nice 值以避免主线程饥饿。
- 如果不可能,那么如何将调度策略更改为允许更改优先级的策略。
编辑:我设法使用其他策略运行程序,例如SCHED_FIFO,我所要做的就是以超级用户身份运行程序
【问题讨论】:
-
也许你需要的是读写器对 RW 锁的偏好?看到这个问题:stackoverflow.com/questions/2190090/…
-
感谢 Alexey 的有用提示,问题是我自己实现了读/写锁,我对这个话题很感兴趣,因为我将来可能会再次需要它
-
此外,规范说如果
pthread_setschedparam()失败,则返回错误号,并且没有提及errno。所以也许你最好检查返回值是否不是 0。 -
我确实检查了错误(代码的最后一行),当我使用
SCHED_OTHER时,它不接受除 0 以外的任何优先级(它抱怨EINVAL错误)。我确实正确使用了SCHED_FIFO(我只需要以超级用户身份运行程序)并根据需要设置优先级,但它并不影响程序执行! -
需要在线程上设置优先级(或“好值”)通常表明存在更大的设计问题。
标签: c multithreading pthreads nice