1

我有一个多线程问题。在我正在排序和修改 NSOrderedSet 的代码位周围放置一个很好的 @synchronized{} 似乎可以解决我正在读回它的部分的问题。我现在的问题是试图弄清楚我的另一个线程来自哪里,以便我可以更好地理解我的代码。这些片段中的任何一个都会导致新线程吗?

CADisplayLink* gameTimer;
gameTimer = [CADisplayLink
             displayLinkWithTarget:self
             selector:@selector(updateDisplay:)];

[gameTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

和/或这会启动一个线程吗?

 AURenderCallbackStruct callbackStruct;
 callbackStruct.inputProc = PerformThru;
 callbackStruct.inputProcRefCon = &_effectState;

 AudioUnitSetProperty(      _effectState.rioUnit, 
                            kAudioUnitProperty_SetRenderCallback,
                            kAudioUnitScope_Global, 
                            bus0, 
                            &callbackStruct, 
                            sizeof(callbackStruct);
 AudioOutputUnitStart(_effectState.rioUnit);

我猜是后者,因为在 PerformThru 函数中,我开始看到调试消息,例如

   Object 0x682ec20 of class __NSOrderedSetM autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

但是,主要我有@autoreleasepool ..所以我猜有什么导致另一个线程。

4

1 回答 1

2

音频单元渲染回调将在私有(对 Core Audio)后台线程中调用。您可以通过在 PerformThru() 中放置断点并注意调试器停止的堆栈帧不在主线程/队列中来看到这一点。

于 2012-07-24T20:38:16.047 回答