用创新的技术,为客户提供高效、绿色的驱动解决方案和服务

以科技和创新为客户创造更大的价值

新闻资讯

ios多线程数据安全(ios多线程nsoperation)

时间:2024-07-10

在IOS中为什么使用多线程及多线程实现的三种方法

1、在iOS中使用多线程是为了让我们的页面不卡,提高用户体验。多线程实现的几种方法如下。NSThread。这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法。但是因为需要自己管理线程的生命周期,线程同步。经常使用NSThread进行调试,在实际项目中不推荐使用。

2、第一种方式会直接创建线程并且开始运行线程,第二种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息 第二种方式继承NSOperation 在.m文件中实现main方法,main方法编写要执行的代码即可。

3、不光ios程序开发,其它的编程语言都有多线程技术。多线程技术可以充分利用cpu 的多核。对比较耗时的操作通过开启一个后台线程来处理,不阻塞主线程。在ios开发中,多线程技术可以用NSThread, 还有更简单易用的GCD多线程技术。

4、您可以使用GCD的串行队列或并发队列来执行数组操作,从而确保操作在不同线程上安全地进行。使用NSOperation和NSOperationQueue:NSOperation和NSOperationQueue也是iOS多线程编程的一种方式,可以将操作封装为操作对象并添加到队列中。这有助于管理并发操作和确保线程安全。

IOS开发,多线程共享一个数据如何防止错乱

默认为setter方法加锁(默认就是atomic),线程安全。 PS: 在iOS开发过程中,一般都将属性声明为nonatomic,尽量避免多线程抢夺同一资源,尽量将加锁等资源抢夺业务交给服务器。NSCondition常用于生产者-消费者模式,它继承了NSLocking协议,同样有lock和unlock方法。

使用互斥锁(Mutex):互斥锁是一种同步机制,可以用于在多线程之间对临界区进行保护,从而避免并发冲突。您可以使用@synchronized关键字或NSLock类来实现互斥锁。

都能保证同一时间只有一个线程访问共享资源。都能保证线程安全。互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。

第二种方式继承NSOperation 在.m文件中实现main方法,main方法编写要执行的代码即可。如何控制线程池中的线程数?队列里可以加入很多个NSOperation, 可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。

根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。信号量是用在多线程并发的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作。

NSThread。这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法。但是因为需要自己管理线程的生命周期,线程同步。经常使用NSThread进行调试,在实际项目中不推荐使用。GCD(Grand Central Dispatch),GCD是基于C语言底层API实现的一套多线程并发机制,非常的灵活方便,在实际的开发中使用很广泛。

IOS多线程安全(线程锁)

线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果。 ios多线程开发中为保证线程的安全常用到的几种锁: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。

由于自旋时不释放CPU,因而持有自旋锁的线程应该尽快释放自旋锁,否则等待该自旋锁的线程会一直在哪里自旋,这就会浪费CPU时间。互斥锁:线程会从sleep(加锁)——running(解锁),过程中有上下文的切换(主动出让时间片,线程休眠,等待下一次唤醒),cpu的抢占,信号的发送等开销。

用递归锁解决, 利用其重入特性: 一个线程可以加N次锁而不会引发死锁 dispatch_semaphore_t 的关键3个方法 所以看出信号量一般处理 加锁(互斥) , 异步返回 , 控制线程并发数 这些场景。

NSRecursiveLock -- 递归锁 保证同一线程下重复加锁; 在多线程环境下,递归调用会造成死锁,多线程在加锁和解锁中,会出现互相等待解锁的情况。 与NSLock一样都是基于pthread_mutex_init实现,只是设置type为递归类型。synchronized -- 递归锁 加锁时,在缓存获取,不会重复创建。

用main queue也是一样的效果,因为main queue也是一个串行队列。串行队列实际上是单线程。第二幅图中使用的并行队列,当block加到并行队列中,不会等待正在执行中的处理,而立即分发到可用线程中去执行。所以block1在等待block2在其他线程中执行完毕,然后才执行block3。

任务的执行是在线程上去执行的。分为同步和异步。所以就可以分成:串行队列同步执行、串行队列异步执行、并行队列同步执行、并行队列异步执行。GCD实现原理:GCD有一个底层线程池,这个池中存放的是一个个的线程。

iOS中的常见线程锁总结

1、第一步:初始化锁属性;第二步:初始化互斥锁,销毁锁属性;第三步:加锁 解锁;第四步:销毁互斥锁 注意点:注意点:OSSpinLock 已经不建议使用了,因为经过大神验证OSSpinLock已经不再可靠。

2、线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果。 ios多线程开发中为保证线程的安全常用到的几种锁: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。

3、OSSpinLock -- 自旋锁 api使用 os_unfair_lock -- 互斥锁 NSLock -- 互斥锁 NSCondition -- 互斥锁 生产 -- 消费 与NSLock同样遵守NSLocking的协议,有同样的lock、unlock的api。NSConditionLock -- 互斥锁 是基于NSCondition进一步封装,自带条件。