多线程iOS环境中的非原子

时间:2011-04-11 21:26:32

标签: objective-c ios4 nsthread

大多数iPhone代码示例在其属性中使用nonatmoc属性。甚至涉及[NSThread detachNewThreadSelector:....]的那些。但是,如果您不在单独的线程上访问这些属性,这真的是一个问题吗?

如果是这种情况,您如何确保将来不会在此不同的地方访问非原子属性,此时您可能会忘记将这些属性设置为非原子属性。这可能会造成困难。

除了将所有属性设置为原子,这在大型应用程序中可能不切实际并且可能引入新的错误,在这种情况下最好的方法是什么?

请注意这些问题仅适用于iOS而非Mac。

1 个答案:

答案 0 :(得分:1)

首先,要知道原子性本身并不能确保您的类的线程安全,它只是生成将以线程安全的方式设置和获取属性的访问器。这是一个微妙的区别。要创建线程安全代码,您很可能需要做的不仅仅是使用原子访问器。

其次,要知道的另一个关键点是,无论原子性如何,都可以安全地从后台或前台线程调用访问器。这里的关键是永远不能同时从两个线程调用它们。也不能从一个线程调用setter,同时从另一个线程调用getter等。如何防止同时访问取决于您使用的工具。

那就是说,为了回答你的问题,你无法确定将来是否会在其他线程上访问你的访问者。这就是为什么线程安全很难,而且很多代码都不是线程安全的。一般来说,如果你正在制作一个框架或库,是的,你可以尝试使你的代码线程安全,以达到“防御性编程”的目的,或者你可以让它保持非线程安全。您的属性的原子性只是其中的一小部分。无论您选择哪种方式,请务必记录下来,以便您图书馆的用户不必怀疑。