2012-07-24 42 views
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調試消息..所以我猜有什麼造成另一個線程。

回答

2

音頻單元渲染回調將在私有(至Core Audio)後臺線程中調用。您可以通過在PerformThru()中放置一個斷點並注意到調試器停止的堆棧幀不在主線程/隊列中來看到這一點。

+0

好的。這是有道理的,我接近那個演繹。作爲後續問題,是否適合將PerformThru的內容包裝在@autoreleasepool {}中?包裝我正在修改@synchronized {}中適當的NSMutableOrderedSet的部分(因爲我在讀取主線程上的Set時遇到問題)?或者,由於某些原因,這些潛在的問題方法是? – DoYouLikeHam 2012-07-24 20:52:59

+0

是的,'@ autoreleasepool'是個好主意。你還沒有發佈足夠的代碼讓我肯定地說,但假設你正在討論在渲染回調中放置'@ synchronized','@ synchronized'可能是一個壞主意。該功能需要快速運行,而不是阻止或您有音頻丟失的風險。等待鎖定可能會導致這個問題。有關更多信息,請參閱http://www.mikeash.com/pyblog/why-coreaudio-is-hard.html。 – 2012-07-24 21:13:48

+0

是的......我在render回調中表示@ synchronized。我在主線程中嘗試@ synchronized,在這裏我正在讀取我在render回調函數中寫入的數據,並且它導致了一些不錯的破壞性,正如我幾乎所期望的(但至少我解決了我的崩潰問題)。感謝回覆,我至少現在明白了在哪裏關注解決這個問題。 – DoYouLikeHam 2012-07-24 21:40:05