iOS 多线程知识体系构建(二):Pthreads、NSThread篇

2023-10-27

本篇首先来学习 iOS 多线程技术中的 Pthreads 和 NSThread。⛽️⛽️

Pthreads

可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是 IEEE(电气和电子工程师协会)为要在各种 UNIX 操作系统上运行软件,而定义 API 的一系列互相关联的标准的总称,其正式称呼为 IEEE Std 1003,而国际标准名称为 ISO/IEC 9945。此标准源于一个大约开始于1985 年的项目。POSIX 这个名称是由理查德·斯托曼(RMS)应 IEEE 的要求而提议的一个易于记忆的名称。它基本上是 Portable Operating System Interface(可移植操作系统接口)的缩写,而 X 则表明其对 Unix API 的传承。–来自百度百科。

Pthreads 一般指 POSIX 线程。 POSIX 线程(POSIX Threads,常被缩写为 Pthreads)是 POSIX 的线程标准,定义了创建和操纵线程的一套 API。

Pthreads 简介

实现 POSIX 线程标准的库常被称作 Pthreads,一般用于 Unix-like POSIX 系统,如 Linux、Solaris、macOS。但是 Microsoft Windows 上的实现也存在,例如直接使用 Windows API 实现的第三方库 pthreads-w32,而利用 Windows 的 SFU/SUA 子系统,则可以使用微软提供的一部分原生 POSIX API。Pthreads 是一套通用的多线程的 API,可以在 Unix / Linux / Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,这里我们对它常用的 API 学习一下,等到后面学习 GCD 源码的时候都会用到。

Pthreads 定义了一套 C 语言的类型、函数与常量,它以 pthread.h 头文件和一个线程库实现。Pthreads API 中大致共有 100 个函数调用,全都以 “pthread_” 开头,并可以分为四类:(这里我们只关注第一类:线程管理,其它三类关于锁的部分可以参考前面锁的文章)

  1. 线程管理,例如创建线程,等待(join)线程,查询线程状态等。
  2. 互斥锁(Mutex):创建、摧毁、锁定、解锁、设置属性等操作。
  3. 条件变量(Condition Variable):创建、摧毁、等待、通知、设置与查询属性等操作。
  4. 使用了互斥锁的线程间的同步管理

Pthreads 使用

在 iOS 中使用 Pthreads API 首先要引入头文件: #import <pthread.h>。我们先看一个最简单的开启线程的例子:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // 定义一个 pthread_t 类型变量,为指向线程的指针,
    // 它实际类型是 struct _opaque_pthread_t 指针。
    pthread_t thread = NULL;

    // 用于在主线程内接收子线程任务执行完成后的返回值。(如果没有返回值则可忽略)
    void* thread_ret = NULL;

    // 准备一个变量用于传递参数
    NSObject *objc = [[NSObject alloc] init];
    NSLog(@"objc: %p", objc);

    // (__bridge void *):在 C 和 OC 之间传递数据,需要使用 __bridge 进行桥接,桥接的目的就是为了告诉编译器如何管理内存。
    // 也可使用 CFBridgingRetain:pthread_create(&thread, NULL, run, (void *)CFBridgingRetain(objc))
    // 但是后要跟 CFBridgingRelease((__bridge void *)objc),要不然会导致 objc 内存泄漏。

    // 直接传递 objc 会提示如下错误,并给了我们两种解决方法:
    // Implicit conversion of Objective-C pointer type 'NSObject *' to C pointer type 'void *' requires a bridged cast
    // Use __bridge to convert directly (no change in ownership)
    // Use CFBridgingRetain call to make an ARC object available as a +1 'void *'

    // MRC 中不需要使用桥接,能直接使用 objc

    int result = pthread_create(&thread, NULL, run, (__bridge void *)(objc));

    if (result == 0) {
        NSLog(@"创建线程成功 									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 多线程知识体系构建(二):Pthreads、NSThread篇 的相关文章

随机推荐

  • 解决微信小程序安卓手机访问不到图片,无法显示图片

    关于微信小程序不显示图片 通病可能有以下几个可能性 非本地图片 确定图片资源存在 copy 图片url再浏览器打开 确定图片资源存在且能正常访问 本地图片 确定相对路径或者绝对路径正确 微信小程序图片路径 不可以存在中文 使用英文做路径和文
  • DataX同步Hive数据丢失,源码修复

    文章目录 DataX简介 DataX 商业版本 DataX的特点 DataX同步Hive数据丢失 DataX的Hive数据源HdfsReader插件 DataX简介 DataX 是阿里云 DataWorks数据集成 的开源版本 在阿里巴巴集
  • 推荐几款好用的压缩软件

    前言 压缩工具作为电脑装机必备软件我们在日常生活中都会经常用到 但是诸如好压 2345 WinRAR等一些常见的压缩软件都会有各种广告弹窗的现象 烦人至极 以下推荐几款免费无广告的强大压缩工具 7 Zip 仅有1M左右的安装包将轻巧便捷阐述
  • [从零开始学习FPGA编程-26]:进阶篇 - 基本组合电路-数据选择器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 数据选择器 1 1 数据选择器概述与原理
  • 能力和结果之间的关系

    大家好 这里是大话硬件 今天这篇文章想和大家分享前段时间的一点工作体会 关于个人能力和工作结果之间的关系 其实这些感悟是在上周三晚上下班 走在回家的路上 脑海中突然出现这样的体会 回到家里立马写了下来 因为是即时的灵感 完全是因为工作状态触
  • Python有限体积流体开尔文-亥姆霍兹不稳定性

    本文 我们将使用有限体积方法模拟开尔文 亥姆霍兹不稳定性 我们将考虑一种可压缩流体 它具有向背景相反方向移动的高密度流 速度切变引起了著名的不稳定性 有时在云层和木星的大红斑中也可以看到这种不稳定性 有限体积法 我们将描述有限体积法来模拟理
  • 【Web自动化】Python3+Selenium 框架⑸——登录页面类方法

    前言 Selenium是一个用于Web应用程序自动化测试工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE 7 8 9 10 11 Mozilla Firefox Safari Google Chr
  • mybatisplus多表关联查询_神奇的SQL:探索多表连接查询的执行细节

    作者 jb hz 来源 https blog csdn net qq 27529917 先构建本篇博客的案列演示表 1 驱动表如何选择 驱动表的概念是指多表关联查询时 第一个被处理的表 使用此表的记录去关联其他表 驱动表的确定很关键 会直接
  • @Cacheable key的使用

    key属性是用来指定Spring缓存方法的返回结果时对应的key的 该属性支持SpringEL表达式 当我们没有指定该属性时 Spring将使用默认策略生成key 我们这里先来看看自定义策略 至于默认策略会在后文单独介绍 自定义策略是指我们
  • 【VTK】VTK9.1+QT6+VS2019编译

    VTK9 1 QT6 2 3 VS2019编译 环境准备 vtk9 1编译 QtCreator工程引入VTK 环境准备 QT安装时选上msvc 环境变量添加QT下bin 下载qt vs tools 不必要 https download qt
  • 一张脑图解析 ConcurrentHashMap 的重点知识点

    欢迎在评论区交流 一起学习 一起进步
  • Spring boot Banner和icon

    文章目录 Spring boot Banner和icon 上一节 源码 Spring boot banner 自定义banner 关闭banner 使用图片充当banner 源码分析 Spring boot icon 源码分析 下一节 Sp
  • 华为实习笔试复盘(1)配送站和客户问题

    写在前面 自己玩了很多项目 但是最近准备秋招的过程中 发现自己对于算法和编程语言的基本功夫实在是太欠缺了 投递了华为的实习岗位 4 26参加机考 一做题就发现了自己很多地方都不会 这里写下笔试后的复盘以警醒自己 题目 按照记忆来回顾题目 仅
  • 计算机毕业设计PHP基于微信小程序在线抽签系统(源码+程序+uni+lw+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 phpStudy Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 原生PHP Vue 等
  • UE4用蓝图画出数学柱状图(第一更)

    UE4用蓝图画出数学柱状图 第一更 利用ue4画出数学柱状图主要用的蓝图节点 新建一个widget 在UI蓝图里面直接用上面四个节点是不行的 需要重写一个UI的函数 所有的绘画都要在这个函数里完成 这个引用在C 里写为了只读 且这个函数也不
  • 55_Pandas.DataFrame 转换为 JSON 字符串/文件并保存 (to_json)

    55 Pandas DataFrame 转换为 JSON 字符串 文件并保存 to json 使用pandas DataFrame的方法to json 可以将pandas DataFrame转为JSON格式字符串 str类型 或者输出 保存
  • 闲谈:如何在js中定义枚举类

    定义枚举的意义和场景 今天遇到了一个场景 页面中有一个下拉框 里面两个选项 国有企业 民营企业 代码结构是这样的 text 国有企业 value 1 text 民营企业 value 2 value是用来存储 text是用来展示 数据回显的时
  • QT错误::-1: error: No rule to make target ‘res.qrc‘, needed by ‘debug/qrc_res.cpp‘. Stop.

    问题分析 出现这种错误是因为选中的资源文件的图片路径中含有中文 解决办法 先删除原有图片路径中含有中文的图片 将图片的路径中含有中文的部分修改后再进行添加 然后再重新执行即可
  • 【Vue】一文让你进入Vue的大门

    Vue简介 官网 英文官网 中文官网 介绍与描述 Vue历史 Vue 是一套用来动态构建用户界面的渐进式JS框架 构建用户界面 把数据通过某种办法变成用户界面 渐进式 Vue可以自底向上逐层的应用 简单应用只需要一个轻量小巧的核心库 复杂应
  • iOS 多线程知识体系构建(二):Pthreads、NSThread篇

    本篇首先来学习 iOS 多线程技术中的 Pthreads 和 NSThread Pthreads 可移植操作系统接口 英语 Portable Operating System Interface 缩写为POSIX 是 IEEE 电气和电子工
Powered by Hwhale