同步处理来自多个线程的数据
Processing data from several threads in sync
使用多线程时是否需要担心同步问题?
我正在编写一个代码来计算不同麦克风通道之间的延迟,并输出几个经过延迟补偿的 .wav 文件。
这是我目前的暴力破解方法:
- 为每个麦克风创建线程(使用 NAudio WaveIn)。
- 每次记录的数据可用时,将它们附加到大的静态缓冲区中(每个麦克风 1 个)。
- 等待检测到脉冲(在本例中为拍手)。
- 查找峰值并确定 'distance'(数组索引之间的差异)。
- 录制完成后,将录制的数据从静态内存存储到 .wav 文件中,并为每个麦克风设置适当的偏移量。
如果由于静态缓冲区的大小有限,整个记录会话很短,我当前的方法(第 2 种)就可以使用。如果我每次都访问记录的数据,我不确定记录的数据是否会同步。
可能的解决方案:
将它们存储在循环缓冲区中。为每个线程实现一个计数器,并在有新数据可用时递增。这使我能够跟踪任何可能的同步问题。
不用担心因为它们不存在吗?
还有其他我不知道的更有效的方法吗?
您接收的数据通常是等距分布的,我没有看到您的线程之间有任何互操作 - 所以在计算方面您应该很好:
但是,根据我的经验,如果您的 WaveIn 回调没有立即处理,NAudio 喜欢丢帧。这肯定会让你失去同步。
使用多线程时是否需要担心同步问题?
我正在编写一个代码来计算不同麦克风通道之间的延迟,并输出几个经过延迟补偿的 .wav 文件。
这是我目前的暴力破解方法:
- 为每个麦克风创建线程(使用 NAudio WaveIn)。
- 每次记录的数据可用时,将它们附加到大的静态缓冲区中(每个麦克风 1 个)。
- 等待检测到脉冲(在本例中为拍手)。
- 查找峰值并确定 'distance'(数组索引之间的差异)。
- 录制完成后,将录制的数据从静态内存存储到 .wav 文件中,并为每个麦克风设置适当的偏移量。
如果由于静态缓冲区的大小有限,整个记录会话很短,我当前的方法(第 2 种)就可以使用。如果我每次都访问记录的数据,我不确定记录的数据是否会同步。
可能的解决方案:
将它们存储在循环缓冲区中。为每个线程实现一个计数器,并在有新数据可用时递增。这使我能够跟踪任何可能的同步问题。
不用担心因为它们不存在吗?
还有其他我不知道的更有效的方法吗?
您接收的数据通常是等距分布的,我没有看到您的线程之间有任何互操作 - 所以在计算方面您应该很好: 但是,根据我的经验,如果您的 WaveIn 回调没有立即处理,NAudio 喜欢丢帧。这肯定会让你失去同步。