2011-11-22 71 views
1

我有一个iOS类,它在单独的线程中进行一些计算,而主线程显示允许用户取消计算的提醒。计算线程使用几个可从主线程和计算线程访问的实例变量。计算线程只读取这些变量,并且主线程在计算线程存在时不写入或读取这些变量。我需要使用NSLock吗?

我的问题是,我需要锁定这些变量?

回答

3

只要有一个线程可以访问它们,不需要锁定它们。尽管如此,尝试这种做法可能是一种好的做法,如果您想从主线程访问它们,那么现在就做这件事会有好处。

+0

感谢您的回答。 “只要只有一个线程可以访问它们...”我通过访问来假设你的意思是阅读。如果两个线程都读取变量是必需的锁定?也许我更常见的问题是锁是否可以用于超越同步的任何目的?我对线程有点新,并且已经看到关于线程陷阱的各种警告,所以我非常仔细地踩踏。 – user1060816

+0

如果所有线程*只读*,不锁定它不应该导致任何问题。如果任何一个线程写入它,所有线程都应该锁定它,以便读取和写入。 – Kevin

2

不,你没有。您只需锁定变量,如果它们将被一次写入多个线程并从中读取。

+3

这并不完全正确。如果您通过一个线程写入变量并仅从另一个线程读取变量,则仍然需要某种同步原语以确保您看到写入。 –

+0

傻我。相应编辑 – twerdster

+0

很酷。颠倒了我的投票。 –

0

同意凯文,你应该计划未来的变化,以防你需要访问它们。

仅供参考,我不会使用警报,因为它会阻止主视图。我推荐一个活动指示器视图以及一个允许它们取消的额外按钮。

您可以在每个常规输入控件(按钮,分段控件等)中进行检查以确保该应用程序“不处理”以接受输入。

- (IBAction)someOtherButtonPressed:(id)sender { 
    if(processingFlag == NO) { 
    // allow handling of input 
    } 
    else { 
    // alert or other message indicating the app is processing 
    } 
}