gpt4 book ai didi

ios - MusicPlayerSetPlayRateScalar 导致 __psynch_mutexwait 挂起/卡住

转载 作者:行者123 更新时间:2023-11-28 06:57:41 37 4
gpt4 key购买 nike

我正在使用 AVFoundationMusicPlayer 在游戏中播放 MIDI 音乐,我会定期调用 MusicPlayerSetPlayRateScalar 来设置速度。我最近将游戏从 Objective-C 移植到 Swift,从那时起,我在调用此函数几十次后就一直挂起/卡住。当卡住发生并且我暂停执行时,我的主线程始终处于以下状态:

* 线程 #1:libsystem_kernel.dylib`__psynch_mutexwait + 8,queue = 'com.apple.main-thread',停止原因 = signal SIGSTOP
* 帧 #0:libsystem_kernel.dylib`__psynch_mutexwait + 8
第 1 帧:libsystem_pthread.dylib`_pthread_mutex_lock_wait + 96
第 2 帧:AudioToolbox`CAMutex::Lock() + 52
第 3 帧:AudioToolbox`SequencePlayer::SetTempoScaleFactor(double) + 36
第 4 帧:AudioToolbox`MusicPlayerSetPlayRateScalar + 136

发生这种情况时,CPU 使用率跃升至 100%,内存使用率开始稳定增长。我没有自己运行的任何其他线程。其他线程事件各不相同,但这是一个示例(其他线程堆栈跟踪的顶层):


线程 #5: libsystem_kernel.dylib`kevent_qos + 8, queue = 'com.apple.libdispatch-manager'
线程 #6:libsystem_kernel.dylib`__semwait_signal + 8,名称 = 'gputools.smt_poll.0x126fe8680'
线程 #10:libsystem_kernel.dylib`mach_msg_trap + 8,名称 = 'com.apple.coreaudio.AQClient'
线程 #11:libsystem_kernel.dylib`semaphore_wait_trap + 8,名称 = 'AudioStreamerImpl::sIOWorkerProcess'
线程 #12:libc++abi.dylib`__cxa_decrement_exception_refcount + 32,名称 = 'AURemoteIO::IOThread'
线程 #13:libsystem_kernel.dylib`mach_msg_trap + 8,名称 = 'AURemoteIO::IOThread'

鉴于互斥量和信号量,我猜到某种死锁,但 CPU 和内存使用模式似乎表明情况并非如此。我该如何进一步调试?

(顺便说一句,当我在这种情况下执行 bt all 时,调试器有时会崩溃,但我怀疑这是否相关。)

最佳答案

Apple 人员在 WWDC 2015 Core Audio 视频中所说的话让我觉得在这样的领域幕后有很多 C++ 巫术,因此 Swift 无法与之交互,除非你采取某些措施预防措施(我不明白它们是什么)。在这种情况下,如果您不需要向后兼容性太远,您可能想尝试使用新的 AVAudioSequencer。我发现它非常简单可靠。

关于ios - MusicPlayerSetPlayRateScalar 导致 __psynch_mutexwait 挂起/卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32918192/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com