Threading Programming Guide:Thread Management
Thread Cost
创建线程是有开销的,这些开销主要包括空间上的开销以及时间上的开销:在kernel里面分配存储空间,用来存储线程相关的数据和属性;线程的栈空间;线程创建的时间。总结如下:
| Item | Approximate Cost | Notes |
| kernel数据结构 | 大约1KB | 主要用来存储线程相关的数据以及属性,这块内存大部分使用的是wired memory,因此不能被交换到disk上 |
| 栈空间 | 辅助线程默认512KB;MAC OSX 上主线程默认8MB;iOS上主线程默认1MB | 对于辅助线程来说,最小的栈空间是16KB,并且栈空间必须是4KB的倍数;栈空间只有在线程真正运行时才会被分配 |
| 创建时间 | 大约90ms | 这个时间依赖具体的机器,不能作为一个绝对的数值 |
注意项:因为Operation Object底层受到了内核支持,并且使用线程池,因此使用Operation Object创建线程会更快。
Creating a Thread
创建线程有两种方式,一种是使用NSThread类来创建,另一种是使用POSIX线程来创建。这里需要注意的是使用NSThread类创建的线程(或者其他类似的方法,比如NSObject的performSelectorOnBackground方法)都是detach线程,线程运行结束之后,线程相关的资源就会被系统回收;而POSIX线程创建的时候,如果没有特别指定,默认是joinable线程(这也是唯一可以创建joinable线程的方式),对于joinable线程来说,除非有其他线程join它,那么即使线程运行结束,相关资源也不会被系统回收。而且,当应用程序退出时,detach线程会立马结束,而joinable线程必须被join才会退出。因此,joinable线程特别适合执行保存数据到磁盘这些关健任务。
除此之外,使用POSIX线程还需要有两点要注意:
1 Cocoa框架基于性能上的考虑,如果应用是单线程,是不会创建锁以及类似的用来线程同步的资源的,除非应用进入了多线程模式。使用NSThread创建线程的时候,会发通知表明应用已经进入了多线程模式,而是用POSIX线程的时候,不会有这个通知。因此使用POSIX线程时,都会首先创建使用NSThread创建一个什么也不做的线程出现,以此来告诉Cocoa框架,应用已经进入了多线程模式。
2 在应用里面,可以同时使用POSIX和Cocoa提供的锁,这些锁可以混用,Cocoa的锁其实也只是对POSIX锁的一种封装而已。但是Cocoa的锁只能使用Cocoa提供的接口操作,POSIX的锁也只能使用POSIX提供的接口操作,比如你不能使用POSIX的接口操作NSLock,反过来也一样。
Writing Your Thread Entry Routine
对于在OC里面创建线程来说,你在入口函数首先要做的,就是在入口函数一开始就创建自动释放池,然后在入口函数退出时释放自动释放池。
Threading Programming Guide:Thread Management的更多相关文章
- View Controller Programming Guide for iOS---(五)---Resource Management in View Controllers
Resource Management in View Controllers View controllers are an essential part of managing your app’ ...
- Structured Streaming编程 Programming Guide
Structured Streaming编程 Programming Guide Overview Quick Example Programming Model Basic Concepts Han ...
- 【IOS笔记】View Programming Guide for iOS -1
原文:View Programming Guide for iOS View and Window Architecture Views and windows present your applic ...
- [IoLanguage]Io Programming Guide[转]
Io Programming Guide Introduction Perspective Getting Started Downloading Installing Binaries Ru ...
- Concurrency Programming Guide 并发设计指引(二)
以下翻译是本人通过谷歌工具进行翻译,并进行修正后的结果,希望能对大家有所帮助.如果您发现翻译的不正确不合适的地方,希望您能够发表评论指正,谢谢.转载请注明出处. Concurrency and App ...
- View Programming Guide for iOS_读书笔记[正在更新……]
原文:View Programming Guide for iOS 1 Introduction 先熟悉一下基本概念. Window Windows do not have any visible c ...
- cocos2d Programming Guide
http://python.cocos2d.org/doc/programming_guide/index.html The cocos2d Programming Guide provides in ...
- View Controller Programming Guide for iOS---(二)---View Controller Basics
View Controller Basics Apps running on iOS–based devices have a limited amount of screen space for d ...
- Table View Programming Guide for iOS---(四)---Navigating a Data Hierarchy with Table Views
Navigating a Data Hierarchy with Table Views 导航数据表视图层次 A common use of table views—and one to which ...
- View Programming Guide for iOS ---- iOS 视图编程指南(五)---Animations
Animations Animations provide fluid visual transitions between different states of your user inter ...
随机推荐
- Spring框架之IoC( Inversion of Control )基础知识入门
1.IoC创建对象的方式 使用无参构造创建对象 假如要使用有参构造创建: 下标赋值constructor-arg <!--有参--> <bean id="User" ...
- C#利用自动化接口编写OPC客户端,OPC Client,源码直接放网盘
引用:https://www.cnblogs.com/flh1/p/12409266.html 链接: https://pan.baidu.com/s/1Vs08c7qjShEc9GQ8dvCkdg ...
- Python生成测试数据--Faker的使用方法
# 官方文档:https://faker.readthedocs.io/en/master/index.html # 安装:pip install Faker from faker import Fa ...
- 基于istio实现单集群地域故障转移
本文分享自华为云社区<基于istio实现单集群地域故障转移>,作者:可以交个朋友. 一 背景 随着应用程序的增长并变得更加复杂,微服务的数量也会增加,失败的可能性也会增加.微服务的故障可能 ...
- 前端使用 Konva 实现可视化设计器(4)
给上一章做一个补充,就是实现通过上下左右按键移动所选节点. 继续求 Star ,希望大家多多一键三连,十分感谢大家的支持~ 创作不易,Star 50 个,创作加速! github源码 gitee源码 ...
- 国密 SM2 的非对称加密解密过程
国密 SM2 的非对称加密解密过程 椭圆曲线 椭圆曲线是由一组方程描述的点的集合: y2 = x3 + ax + b 其中 a, b 满足 (4a3 + 27b2 ≠ 0) SM2 定义了一个 sm2 ...
- 【01】微服务(Microservice)是什么?为什么会出现微服务?
微服务(Microservice)虽然是当下刚兴起的比较流行的新名词,但本质上来说,微服务并非什么新的概念. 实际上,很多 SOA(面向服务的架构)实施成熟度比较好的企业,已经在使用和实施微服务了.只 ...
- MMDeploy部署实战系列【第五章】:Windows下Release x64编译mmdeploy(C++),对TensorRT模型进行推理
MMDeploy部署实战系列[第五章]:Windows下Release x64编译mmdeploy(C++),对TensorRT模型进行推理 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善 ...
- Tencent 闲聊对话机器人接口调用,画像:设计员小白
from datetime import datetime import time import requests from hashlib import md5 from urllib import ...
- javascript现代编程系列教程之一:区块作用域对VAR不起作用的问题
在JavaScript中,使用var声明的变量具有函数作用域,而不是块级作用域.这意味着在一个函数内部,使用var声明的变量在整个函数范围内都是可见的,包括嵌套的块(如if语句.for循环等).为了避 ...