【问题标题】:Two threads call one function > Does local variable access need to be synchronized?两个线程调用一个函数 > 局部变量访问是否需要同步?
【发布时间】:2011-10-30 00:54:57
【问题描述】:

如果两个线程“同时”调用一个函数 函数本地变量(不是 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 架构。 (如果这很重要,这个示例函数也可以很容易地是静态的?)

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

感谢您的帮助和耐心!

【问题讨论】:

  • 没有。有关该主题的更多背景信息,请参阅 [此讨论][1]。 [1]:stackoverflow.com/questions/7092143/…
  • 啊,“琐碎”的答案转换为难以辨认的评论。自动化的奇迹。
  • 感谢丹尼尔提供的额外信息!虽然,在阅读了您的链接文章后,我的知识还不够丰富,无法知道 Java 特有的行为与基于 C 的语言常见的行为。 =\
  • 基于 C 的语言使用与 Java 相同的基本自动堆栈模型。 (有人会反对 Java 使用操作数堆栈,这是一个不同的模型,但这是一个软件“虚构”,建立在与 C 相同的基本自动堆栈模型上。)

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


【解决方案1】:

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

【讨论】:

  • 这就是我希望的答案!谢谢你的清理~
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多