Objective C では、さまざまなスレッドから NSMutableArray インスタンスを使用しており、@synchronized を使用してスレッド セーフにしています。現在、この配列へのすべてのアクセスは、objectAtIndex: メソッドであっても @synchronized ブロックで保護されています。それにもかかわらず、どのメソッド呼び出しを @synchronized で保護する必要があるのか 疑問に思います。読み取りアクセスを保護する必要がありますか?
「ObjectAtIndex」が保護されておらず、「removeObject」と同時に呼び出された場合はどうなりますか?
すべてのメソッドが @synchronized によって保護されている場合、パフォーマンスはどうなりますか? (私は tcp/udp ゲーム サーバーを作成していますが、パフォーマンスが低下したりロックが生成されたりする場合、これらのアレイを過度に保護したくありません)。
たとえば、「containsObject:」メソッドがオブジェクトを見つけるために列挙し、別のスレッドで「removeObject:」を同時に呼び出すことは避けるべきだと思います。
おそらく良い解決策は、(読み取りアクセスと書き込みアクセス用に) あまりにも異なるロックを設定することです...
ヘルプと提案は大歓迎です!
どうもありがとう。
説明するために、以下のサンプル コードを見つけてください。
@interface TestClass : NSObject
{
NSMutableArray * array;
}
@end
@implementation TestClass
- (id)init
{
self = [super init];
if (self)
{
array = [NSMutableArray array];
}
return self;
}
-(id)objectAtIndex:(NSUInteger)index
{
@synchronized(array) **// IS IT USEFUL OR NOT ??**
{
return [array objectAtIndex:index];
}
}
-(void)removeObject:(id)object
{
@synchronized(array)
{
[array removeObject:object];
}
}
-(void)compute
{
@synchronized(array)
{
for (id object in array)
{
[object compute];
}
}
}
@end