【发布时间】:2018-10-06 10:08:30
【问题描述】:
这里绝对是多线程新手。
我有一个播放音乐的多媒体应用程序。具体来说,它有一个读取一些数据的音频线程 - 例如一个波形 - 并将其发送到声卡。这是一个实时操作,因此必须以“非阻塞”方式尽快执行。
另一方面,还有另一个线程负责处理用户界面。在这里,用户可以对该数据执行一些操作 - 例如通过添加或删除块来修改波形。这当然应该是可能的,但音频线程必须保持不受干扰地运行,并且始终提供可用的数据。
我的第一个想法是这样的(c++-ish pthread 伪代码):
音频线程:
vector<sample> samples; // this is shared between this thread and the UI thread
mutexLock();
for (Sample sample : samples)
play(sample);
mutexUnlock();
还有 UI 线程:
void onEditSample()
{
while (mutexTryLock() == 0)
{
editSamples(samples);
mutexUnlock();
break;
}
}
但我不太确定 try-lock 部分。您认为处理此问题的最佳方法是什么?
【问题讨论】:
-
您可能想研究标准Thread support library 的类和特性。由于您的问题过于宽泛,无法为您提供简洁的建议,这将有助于未来的研究人员解决您的问题。
-
@πάνταῥεῖ 我喜欢标准库中的线程。但是我现在有点坚持使用 pthreads。反正基础理论应该是一样的吧?
-
如果您不能使用当前的 c++11 标准库,我建议您为底层 pthreads 函数编写包装类。你可以很容易地想出相同的接口,所有的原则(尤其是使用 RAII 和锁守卫都是一样的)。
-
您可能希望将要在小缓冲区负载中播放的波形发送到音响系统,只锁定波形以复制每个缓冲区。还使用播放线程的读锁和波形编辑线程的写锁,但仅在完成编辑后准备好被复制到共享波形上。
标签: c++ multithreading pthreads