Два потока вызывают одну функцию> Нужно ли синхронизировать доступ к локальной переменной? - PullRequest
2 голосов
/ 18 августа 2011

Если два потока вызывают одну функцию «одновременно», нужно ли защищать переменные , локальные для функции (не ivars) в блоке мьютекса / синхронизации, чтобы другие потоки не могли их изменять / манипулировать?

Или же каждый поток получает свою собственную копию локальных переменных в стеке, как / должен делать рекурсивный вызов?

Использовать приведенную ниже крайне фальшивую и бессмысленную функцию в качестве примера того, чтоЯ не уверен, что потокобезопасен:

- (TicketResponseObj *)createTicketResponse:(NSHTTPURLResponse *)httpResponse {

    //local variable declaration and assignment
    NSInteger localVar_RespCode = [httpResponse statusCode]; 

    //local object ptr declaration, obj allocation, and ptr assignment
    TicketResponseObj *localObj_TicketResponse = [[TicketResponseObj alloc] initWithCode:localVar_RespCode];

    //return ptr to instance of local object
    return localObj_TicketResponse;
}

Пожалуйста, предположите, что TicketResponseObj's initWithCode является потокобезопасным.Я использую LLVM-GCC 4.2 в качестве моего компилятора и нацеливаюсь на архитектуру armv7.(Этот пример функции тоже может быть статичным, если это имеет значение?)

Извините, я знаю, что это потенциально глупый вопрос, но мой друг предположил, что ответ полностью зависит от компилятора / архитектуры и т. Д.

Спасибо за вашу помощь и терпение!

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Нет, их не нужно синхронизировать.Локальные переменные и ссылки на переменные существуют в стеке, и поэтому каждый поток поддерживает свой собственный стек.Среда выполнения уже обеспечивает параллельный доступ к распределителю кучи в случаях alloc и new.

.
1 голос
/ 18 августа 2011

Каждый поток получает свою собственную копию локальных переменных в стеке, как рекурсивный вызов.

...