【发布时间】:2015-02-28 13:52:54
【问题描述】:
互联网上的许多人在编写音频软件时说,最重要的是不使用内存分配或阻塞代码,即不使用锁。由于这些是非确定性的,因此可能导致输出缓冲区下溢并且音频会出现故障。
当我编写视频软件时,我通常同时使用两者,即在堆上分配视频帧并使用锁和条件变量(有界缓冲区)在线程之间传递。我喜欢它提供的强大功能,因为每个操作都可以使用单独的线程,从而使软件能够最大限度地利用每个内核,从而提供最佳性能。
对于音频,我想做类似的事情,在线程之间传递大约 100 个样本的帧,但是,有两个问题。
如何在不使用内存分配的情况下生成帧?我想我可以使用预先分配的帧池,但这看起来很乱。
我知道您可以使用无锁队列,并且 boost 有一个很好的库来执行此操作。这将是在线程之间共享的好方法,但是不断地轮询队列以查看数据是否可用似乎占用了大量的 CPU 时间。
根据我的经验,使用互斥锁实际上并不需要太多时间,只要互斥锁被锁定的部分很短。
什么是实现线程之间传递音频帧的最佳方式,同时将延迟保持在最低限度,不浪费资源并使用相对较少的非确定性行为?
【问题讨论】:
-
我对音频了解不多,但这听起来像是一个传统的生产者/消费者问题,你看过计算信号量吗?
-
你还需要线程吗?音频数据比视频便宜很多。
-
@immibis,这取决于您在音频线程中所做的工作。视频通常每个像素只执行很少的操作,而音频合成对每个样本的要求可能非常高。
-
我同意@immibis。线程输出音频的时间几乎为零,因此您不会真正“最大化”两个内核。单线程会更简单,没有真正的缺点。
-
我可以向你保证,在这个软件中,使用单线程不是一个选项。
标签: c++ multithreading audio