两个线程调用一个函数>是否需要同步本地变量访问?

时间:2011-08-18 18:14:45

标签: objective-c ios multithreading thread-safety armv7

如果两个线程同时调用一个函数,  是否需要在互斥/同步块中保护函数本地函数(非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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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