ios - 获取一个可变数组的内容时,要上锁吗?
怪我咯
怪我咯 2017-04-17 17:52:03
[iOS讨论组]

看苹果的文档,看到以下的示例

NSLock* arrayLock = GetArrayLock();
NSMutableArray* myArray = GetSharedArray();
id anObject;
 
[arrayLock lock];
anObject = [myArray objectAtIndex:0];
[anObject retain];
[arrayLock unlock];
 
[anObject doSomething];
[anObject release];

说是为了保证线程安全。
想问问各位,平时写代码的时候会这么做吗?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
阿神

你的代码中提到的是对一个数组取值的时候进行加锁,主要是为了线程安全,原因在于:
如果不加锁的话,如果下面的情况同时发生,这时候:

  1. 线程A在读

  2. 线程B、线程C在写不同的值

那么,线程A可能会读到三种值,即原始值、线程B修改之后的值、线程C修改之后的值(极端情况下可能取到的值都已经被破坏了,比如,一个稍微大点的文件),最终的值可能是B修改之后的,也可能是C修改之后的。

所以针对这种情况,在并发编程的情况下(要是单线程的话,没事加啥锁),我们一般会加锁,那么这有很多种方式:

  1. atmoic,我一般不太用,因为它的锁会限制单线程读写,虽然我要单线程写,但是我不要单线程读。而且,并不一定可以线程安全。

  2. dispatch_barrier

  3. 类似于你上面的其他锁等。

不管什么方式,都是为了数据一致性和线程安全,可能我们平时写法上会比较少这么写(因为你可能写并发不多)。

所以,在你确认你是之用主线程(单线程),或者你能确保不会出现多线程读写的情况的话,你可以不加任何东西。

当然,即使你可能会有多线程读写的情况,也不一定会发生数据不一致,这其中有很大的偶然性。

天蓬老师

还有“release”,很老的文档了吧。
iOS里从来没用过,也没见过。

PHP中文网

要不要上锁取决于你会不会在多个线程里操作这个可变数组,上锁有些太重了,大部分时候都应该避开。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号