Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在音频回调中使用互斥_Multithreading_Audio - Fatal编程技术网

Multithreading 在音频回调中使用互斥

Multithreading 在音频回调中使用互斥,multithreading,audio,Multithreading,Audio,在编写音频应用程序时,一般都很清楚,音频驱动程序回调中不应使用某些无界操作。这些操作通常包括分配内存、读取或写入磁盘或网络、锁定互斥锁/关键部分等 我目前正在重新编写音乐应用程序Cantable()的音频引擎,整个引擎现在完全没有锁,除了一个区域,我很欣赏其他人的意见 Cantable可以利用多个处理器/内核来处理音频。它通过构建一个工作项树,然后唤醒一个线程池来实现这一点,所有线程都有助于完成任务。线程池中的所有线程都以可能的最高优先级运行(Windows上的时间关键型+vista mmcss

在编写音频应用程序时,一般都很清楚,音频驱动程序回调中不应使用某些无界操作。这些操作通常包括分配内存、读取或写入磁盘或网络、锁定互斥锁/关键部分等

我目前正在重新编写音乐应用程序Cantable()的音频引擎,整个引擎现在完全没有锁,除了一个区域,我很欣赏其他人的意见

Cantable可以利用多个处理器/内核来处理音频。它通过构建一个工作项树,然后唤醒一个线程池来实现这一点,所有线程都有助于完成任务。线程池中的所有线程都以可能的最高优先级运行(Windows上的时间关键型+vista mmcss boost),并且除了音频处理之外不做任何其他事情(即:它们不用于其他后台实用程序任务)

为了实现所有这些,我使用一个条件变量来唤醒工作线程,并使用一个关键部分来序列化对工作项树的访问。关键部分有一个旋转计数,并且锁定的时间刚好足够工作人员从树中提取下一个工作项

我的理由是:

  • 自旋计数应始终涵盖任何其他线程释放锁所需的时间
  • 即使旋转计数不够,也不应该出现优先级反转问题,因为所有线程都以时间关键优先级运行
  • 没有一个工作线程执行任何其他潜在的无界操作(除了可能在处理写得不好的插件时,但我对此无能为力)
  • 我已经针对这一点运行了很多测试,它似乎运行得很好,但像这样的事情有一个习惯,就是在最意想不到的时候绊倒一个


    我忘了什么吗?

    没有保证就意味着没有保证。“我的线程具有高优先级”≠ “不能有优先级反转”。使用boost.lockfree并问心无愧:)@DarkWanderer是否需要详细说明为什么具有相同优先级的多个线程都满足一个互斥锁会导致优先级反转问题?这里的要点是不要让一个实时线程被暂停,等待一个低优先级线程持有互斥锁。在我的例子中,所有有问题的线程都有助于尽快完成相同的实时任务。@darkwander和boost.lockfree一样,我在与音频引擎的所有其他交互中使用无锁数据结构(尽管不是boost)。这是一个特殊的案例,我还没有找到使用无锁解决方案来解决当前问题的方法——即一个工作线程池,在依赖关系树中执行一组工作项。最后,我使用了这种方法,它工作得很好——特别是在对它进行了调优以最小化锁定之后。好吧,有一种情况总是会发生,一个线程在获得锁的同时会被重新调度——如果只有另一个具有相同优先级的线程等待它的话。虽然在实践中不太可能造成问题,但理论上可以。不是优先级反转,你是对的,但仍然不是你想要的