我有更多的概念问题。假设一个程序运行两个线程。两个线程一直在运行循环。一个线程负责流式传输数据,另一个线程负责接收第一个线程必须流式传输的文件。因此,文件传输线程循环接收它写入文件的数据,流线程在需要时从该文件中读取该数据并将其流式传输。
我在这里看到的问题是,当文件传输占用过多的 CPU 周期并因此导致流线程滞后时,如何避免饥饿?
我如何能够在这两个线程之间有效地共享 CPU 知道流传输数据远慢于文件传输接收它。
我感谢你的建议。
我有更多的概念问题。假设一个程序运行两个线程。两个线程一直在运行循环。一个线程负责流式传输数据,另一个线程负责接收第一个线程必须流式传输的文件。因此,文件传输线程循环接收它写入文件的数据,流线程在需要时从该文件中读取该数据并将其流式传输。
我在这里看到的问题是,当文件传输占用过多的 CPU 周期并因此导致流线程滞后时,如何避免饥饿?
我如何能够在这两个线程之间有效地共享 CPU 知道流传输数据远慢于文件传输接收它。
我感谢你的建议。
很多时候这类问题是通过使用某种流控制来解决的:
当接收者忙时阻止发送者。
这也会导致问题:如果你的程序必须能够快进(seek forward),那么这不是一个好主意。
在您的情况下,当文件中有超过 2MB 的非流式数据时,您可以阻止文件传输线程。并在未流式传输数据少于 1MB 时恢复它。
看看是否pthread_setschedparam()
有助于平衡线程对 CPU 的使用
从手册页中pthread_setschedparam
,您可以更改线程优先级。
pthread_setschedparam(pthread_t thread, int policy,
const struct sched_param *param);
struct sched_param {
int sched_priority; /* Scheduling priority */
};
As can be seen, only one scheduling parameter is supported. For details of
the permitted ranges for scheduling priorities in each scheduling policy, see
sched_setscheduler(2).
还,
文件传输占用了太多的 CPU 周期
如果您阅读此SO 帖子,似乎表明更改线程优先级可能无济于事。因为文件传输线程消耗更多 CPU 周期的原因是它需要它。但是在您的情况下,如果文件传输速度变慢,因为流媒体线程无论如何都无法竞争,您就可以了!因此,我建议您更改优先级并剥夺文件传输线程的一些周期,即使需要它