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調試消息..所以我猜有什麼造成另一個線程。
好的。這是有道理的,我接近那個演繹。作爲後續問題,是否適合將PerformThru的內容包裝在@autoreleasepool {}中?包裝我正在修改@synchronized {}中適當的NSMutableOrderedSet的部分(因爲我在讀取主線程上的Set時遇到問題)?或者,由於某些原因,這些潛在的問題方法是? – DoYouLikeHam 2012-07-24 20:52:59
是的,'@ autoreleasepool'是個好主意。你還沒有發佈足夠的代碼讓我肯定地說,但假設你正在討論在渲染回調中放置'@ synchronized','@ synchronized'可能是一個壞主意。該功能需要快速運行,而不是阻止或您有音頻丟失的風險。等待鎖定可能會導致這個問題。有關更多信息,請參閱http://www.mikeash.com/pyblog/why-coreaudio-is-hard.html。 – 2012-07-24 21:13:48
是的......我在render回調中表示@ synchronized。我在主線程中嘗試@ synchronized,在這裏我正在讀取我在render回調函數中寫入的數據,並且它導致了一些不錯的破壞性,正如我幾乎所期望的(但至少我解決了我的崩潰問題)。感謝回覆,我至少現在明白了在哪裏關注解決這個問題。 – DoYouLikeHam 2012-07-24 21:40:05