如果两个线程同时调用一个函数, 是否需要在互斥/同步块中保护函数本地函数(非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架构。
(如果重要的话,这个示例函数也很容易变成静态的吗?)
很抱歉,我知道这可能是一个愚蠢的问题,但我的朋友建议答案完全取决于编译器/架构等。
感谢您的帮助和耐心!
答案 0 :(得分:4)
不,他们不需要同步。堆栈上存在局部变量和变量引用,因此每个线程都维护自己的堆栈。对于alloc
和new
的情况,运行时已经负责允许对堆分配器进行并发访问。
答案 1 :(得分:1)
每个线程都在堆栈上获得自己的局部变量副本,就像递归调用一样。