iOS-多线程死锁问题

虽然作者在开发中经常会用到多线程,但是对于死锁、线程阻塞等问题还是比较模糊,一般都是先写吧,有问题再改,现在闲下来了,是时候总结一波了,本文主要总结一下同步/异步、串行/并行、死锁、线程阻塞等问题

  • 串行/并行 串行(Serial Queue):同一时间内,队列中只能执行一个任务,只有当前的任务执行完成之后,才能执行下一个任务 并行(concurrent Queue):同时允许多个任务执行(并行队列中才会有多个线程,串行的只有一个线程)
  • 同步/异步 同步(Sync):等到当前的任务执行完成,线程才会继续去执行下面的任务 异步(Async):线程会立即返回,无需等待就会继续直线下面的任务
  • 死锁 两个或以上的线程互相等待彼此执行,通常情况有(在同一串行队列中执行同步操作,或两个线程互相依赖等情况)
  • 阻塞 只要是同步操作都会阻塞一个线程

所以 1.在遇到需要多线程相互依赖的情况,一定要注意,不要两个线程互相依赖,这样会造成死锁 2.在使用同步线程时,要注意不要在同一个串行队列中使用,还要注意线程阻塞问题

下面是相关代码 申请一个串行队列

// 串行
let serQueue = DispatchQueue(label: "serial")

申请一个并行队列

// 并行
let conQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)

串行同步、串行异步

// 串行同步
serQueue.sync {
     print("串行同步")
}
// 串行异步
serQueue.async {
     print("串行异步")
}

并行同步、并行异步

// 并行同步
conQueue.sync {
     print("并行同步")
}
// 并行异步
conQueue.async {
     print("并行异步")
}

死锁情况 线程相互依赖

let opA = Operation()
let opB = Operation()

opA.addDependency(opB)
opB.addDependency(opA)

串行中同步

// 死锁
serQueue.async {
     serQueue.sync {
          print(1)
     }
}
serQueue.sync {
     serQueue.sync {
          print(1)
     }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

linux系统下的权限知识梳理

下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明。 linux中除了常见的读(r)、写(w)、执行(x)权限以外,还有其他的一些特...

3116
来自专栏喵了个咪的博客空间

Otter-入门篇2(Manager安装配置)

Otter-入门篇2(Manager安装配置) ? 前言 上一节已经简单介绍了Otter的基本信息,本节我们就来开准备搭建一个我们自己的Otter环境,因为一个...

41811
来自专栏小俊博客

DNSmasq详细解析及详细配置

Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。...

13.2K3
来自专栏蓝天

ZooKeeper-3.4.6分布式安装指南

介绍ZooKeeper-3.4.6版本的分布式安装,力求细致,提供精确的安装指导。本文的安装环境是64位的SuSE 10.1 Linux,也适用于ZooKe...

1521
来自专栏difcareer的技术笔记

将自己编译的AOSP刷入nexus5

ubuntu14.04编译Android4.4源码讲述了用于模拟器的AOSP编译过程,在完整编译了源码以后,会自动将编译结果目录加入到path中,此时运行 em...

1573
来自专栏猿人谷

在Mac OS X上配置Apache2

最近一段时间在开发面向移动设备的网页,而且是静态网页。所以很需要一个HTTP服务器,简单明了的就可以。在Windows上,HFS(http://www.reje...

3255
来自专栏散尽浮华

分布式监控系统Zabbix-添加windows监控主机

大多数情况下,线上服务器都是linux系统,但是偶尔也会有些windows机器。下面简单介绍下zabbix添加windows监控机的操作: 1)下载windo...

3197
来自专栏张首富-小白的成长历程

用户相关的文件及命令

Linux system每个文件和进程,都需要对应一个用户和组, Linux system是通过UID和GID来识别用户和组的。用户名相当于人名,UID相当于×...

1374
来自专栏情情说

Netty事件监听和处理(下)

上一篇 介绍了事件监听、责任链模型、socket接口和IO模型、线程模型等基本概念,以及Netty的整体结构,这篇就来说下Netty三大核心模块之一:事件监听和...

4275
来自专栏Aloys的开发之路

如何发布Maven依赖到中央仓库

平时我们都是从Maven中央仓库下载依赖,如果我们想发布我们自己写的Maven依赖到中央仓库供别人下载使用应该怎么办?这里以上传自己写的simian-maven...

3353

扫码关注云+社区

领取腾讯云代金券