2

如果两个线程“同时”调用一个函数,是否需要在互斥锁/同步块中保护该函数的本地变量(不是 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 架构。(这个示例函数也很容易是静态的,如果这很重要?)

抱歉,我知道这可能是一个愚蠢的问题,但我的朋友建议答案完全取决于编译器/架构等。

感谢您的帮助和耐心!

4

2 回答 2

4

不,它们不需要同步。局部变量和变量引用存在于堆栈中,因此每个线程都维护自己的堆栈。对于 和 的情况,运行时已经负责允许对堆分配器的并发alloc访问new

于 2011-08-18T18:29:41.773 回答
1

每个线程都在堆栈上获取自己的局部变量副本,就像递归调用一样。

于 2011-08-18T18:28:07.193 回答