我编写了一个程序,可以从三个视频卡中捕获和显示视频。对于每一帧,我都会生成一个线程,将帧压缩为 Jpeg,然后将其放入队列以写入磁盘。我还有其他线程从这些文件中读取并在自己的线程中对其进行解码。通常这工作正常,它是一个相当 CPU 密集型程序,使用了所有六个 CPU 内核的大约 70-80%。但过了一会儿,编码突然变慢,程序无法足够快地处理视频并开始丢帧。如果我检查 CPU 利用率,我可以看到一个核心(通常是核心 5)不再做太多事情。
发生这种情况时,我退出并重新启动我的程序也没关系。 CPU 5 的利用率仍然很低,程序会立即开始丢帧。删除所有保存的视频也没有任何效果。重新启动计算机是唯一有帮助的方法。哦,如果我将我的程序的亲和性设置为使用除半空闲核心之外的所有核心,它会一直工作,直到另一个核心发生同样的事情。这是我的设置:
- AMD X6 1055T(低温静音关闭)
- GA-790FX-UD5主板
- 4Gig RAM unganged 1333Mhz'
- Blackmagic Decklink DUO 采集卡 (x2)
- Linux - Ubuntu x64 10.10 内核 2.6.32.29
我的应用使用:
- libjpeg-turbo
- posix 线程
- decklink 接口(interface)
- Qt
- 用 C/C++ 编写
- 所有库都是动态链接的
在我看来,这似乎是 Linux 在核心上调度线程的方式存在某种问题。还是有什么方法可以让我的程序变得糟糕到无法帮助重新启动程序?
感谢您的阅读,欢迎任何和所有意见。我卡住了:)
最佳答案
首先,确保它不是您的程序 - 也许您遇到了一个复杂的并发错误,即使您的程序体系结构不太可能出现这种情况,而且重启内核会有所帮助。我发现,通常,一个好的方法是事后调试。使用调试符号编译,当程序表现异常时使用 -SEGV 终止程序,并使用 gdb 检查核心转储。
关于c++ - 什么会导致我的程序在一段时间后无法使用所有内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626468/