Posts tagged: c
Увидел сегодня очень интересный метод инициализации класса один раз (вернее на самом деле - не один раз, но “должен остатся только один”). Все закручено вокруг libc’шного OSAtomicCompareAndSwapPtrBarrier, который гарантирует либо атомарную установку указателя на нужный объект или фейл. Таким образом надо проверить статическую переменную, и если она все еще nil - то создать новый экземпляр себя и попробовать подменить nil настоящим указателем. Если получилось - у нас есть первый и единственный инстанс объекта, если нет - то было создано два (или более) объектов одновременно и все лишние пойдут в release.
Собственно сниппет (спионерен отсюда):
+ (id)defaultCenter
{
static MAKVONotificationCenter *center = nil;
if(!center)
{
// do a bit of clever atomic setting to make this thread safe
// if two threads try to set simultaneously, one will fail
// and the other will set things up so that the failing thread
// gets the shared center
MAKVONotificationCenter *newCenter = [[self alloc] init];
if(!OSAtomicCompareAndSwapPtrBarrier(nil, newCenter, (void *)¢er))
[newCenter release];
}
return center;
}