我正在使用 libx264 库将视频数据压缩到... x264。
我使用默认值让库根据需要创建尽可能多(少)的线程:
param.i_threads = X264_THREADS_AUTO;
这在我有 64 个处理器(2 个 CPU,每个 CPU 有 16 个内核和英特尔线程)的服务器上效果很好。它实际上将使用大约 5 个线程。
但是,在运行该软件的嵌入式计算机上,我只有 4 个 CPU。它是 Xeon,所以那里没有太多问题,但不知何故它会阻止 USB 端口正常工作。我们正在从那个 USB 端口接收数据,当 4 个 CPU 以大约 100% 的速度使用时,libx264 代码会非常糟糕地接管整个计算机。
我正在考虑两种解决方案,使用 3 作为最大线程数:
param.i_threads = 3;
或者让那些 libx264 线程有一个(很多)更高的 nice 值,这样在该计算机上运行的其他东西就不会被阻塞(即 CPU 更好地共享;其他东西不使用太多 CPU,它通常远低于 10%) .
但是,我无法控制 libx264 库如何创建线程,并且想知道在调用创建线程的 libx264 函数之前更改 nice 值是否对我有用,因此这些线程使用该 nice 值,像这样的东西:
nice(10);
...call libx264 functions...
nice(0);
使这些线程使用+10的好值的意愿?从我在pthread_create()
手册页中可以看到,它并没有明确说明线程继承父线程的 nice 值......
注1:我知道这个问题不太可能是USB端口可能正在与视频采集卡争夺DMA......如果是这种情况,我们显然不会通过改变来解决任何问题进程的优先级。我想先试试那个软解决方案。
虽然我可以将 USB 端口移到另一台计算机上,但数据会通过网络传输,这很可能会出现类似的硬件冲突问题。
注意 2:我不想重新编译 libx264 并更改该代码。这超出了我的项目范围。