在写入对象时枚举对象时防止崩溃

时间:2014-11-01 18:17:53

标签: objective-c multithreading thread-safety locking

我有一个使用可变字典的多线程应用程序。字典每秒写入多次。每次写入时,也会在之后直接枚举。更新的字典在更新后直接连接到Quartz Composer合成上的已发布输入。当更新频繁发生时,当我们在同时写入对象时尝试枚举对象时,我发现崩溃。

if( self.dictEvent && [ [ self.renderer inputKeys ] containsObject: @"Event" ] )
{
    @synchronized( self.dictEvent )
    {
        [ self.renderer setValue: self.dictEvent forInputKey: @"Event" ];               
    }
}

它崩溃了:

[ self.renderer setValue: self.dictEvent forInputKey: @"Event" ];               

我知道这一行在字典传递给QC组合时枚举并序列化了字典。

我试图在字典的写入和这个位置上使用@synchronized,它被枚举。这没有成功。我不清楚@sychronized是否仅保护线程不运行相同的代码块,或者它是否可以阻止线程运行任何代码块同步相同的对象。

如果我用以下内容替换违规行:NSLog(@“Event:%@”,self.dictEvent);我收到以下消息:

2014-11-01 10:48:02.679 Flocaster [24583:8446817] *由于未捕获的异常'NSGenericException'而终止应用程序,原因:'* 集合< __ NSCFDictionary:0x618000e6ed00>在被列举时被突变。'

您可以提供的任何提示区域都非常感谢!

谢谢! 亚当

0 个答案:

没有答案