iOS-线程安全问题

171 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

线程安全问题

多线程是个好东西,但是我们在使用的过程中也要注意。多线程访问同一块资源时,容易发生数据错乱和数据安全问题。

互斥锁(sync)

锁的范围小,效率越高;锁对象要保证所有线程都能访问; 如果有线程正在执行,其他线程就会休眠。

自旋锁(atomic)

在获取锁之前,一直处于忙等状态;占用CPU资源。 锁的持有时间短,且线程不希望在重新调度上花太多成本时,就会用自旋锁。

目前已经不安全了,因为会出现优先级反转问题。

系统在调度线程的时候,会存在优先级,如果等待锁的线程优先级比较高,就会出现一直占用CPU资源,优先级低的。

多读单写

可以同时读取,但是在写入的时候会加锁。

多线程方案

技术方案平台性语言线程生命周期使用频率
Pthread跨平台、可移植。使用难度大C语言开发人员管理几乎不用
NSThread使用更加面向对象。简单易用,可直接操作线程对象Objective-C开发人员管理偶尔使用
GCD旨在代替NSThread等线程技术;充分利用线程的多核C语言自动管理经常使用
NSOperation基于GCD的封装,更加面向对象,使用方便。多了一些简单实用的功能Objective-C自动管理经常使用

线程通信:

  • 消息传递,perforamSelector
  • 全局变量,共享内存和对象
  • 条件执行
  • runloop sources
  • port and socket
  • 消息队列
  • Cocoa 分布式对象