同步处理来自多个线程的数据

Posted

技术标签:

【中文标题】同步处理来自多个线程的数据【英文标题】:Processing data from several threads in sync 【发布时间】:2015-12-20 22:00:30 【问题描述】:

在使用多个线程时我是否需要担心同步问题?

我正在编写一个代码,该代码计算不同麦克风通道之间的延迟并输出几个补偿延迟的 .wav 文件。

这是我目前的蛮力方法:

    为每个麦克风创建线程(使用 NAudio WaveIn)。 每次录制的数据可用时,将它们附加到大的静态缓冲区中(每个麦克风 1 个)。 等待检测到脉冲(在本例中为拍手)。 寻找峰值并确定“距离”(数组索引之间的差异)。 录制完成后,将录制的数据从静态内存存储到 .wav 文件中,并为每个麦克风设置适当的偏移量。

如果由于静态缓冲区的大小有限,总录制会话很短,我当前的方法(编号 2)就可以工作。如果我在每次可用时访问记录的数据,我不确定记录的数据是否会同步。

可能的解决方案:

    将它们存储在循环缓冲区中。为每个线程实现一个计数器,并在新数据可用时递增。这使我能够跟踪任何可能的同步问题。

    不担心这个问题,因为它们不存在?

    我不知道的其他可能的、更有效的方法?

【问题讨论】:

【参考方案1】:

您收到的数据通常是等距分布的,我看不到您的线程之间有任何互操作 - 所以在计算方面您应该很好: 但是,根据我的经验,如果您的 WaveIn 回调没有立即处理,NAudio 喜欢丢帧。这肯定会让你失去同步。

【讨论】:

以上是关于同步处理来自多个线程的数据的主要内容,如果未能解决你的问题,请参考以下文章

线程同步与死锁

线程同步(基于java)

线程同步并发名词解释(摘录)

同步多线程(超线程)是“真正的”多核处理吗?

线程同步处理

NIO 和BIO