adolsai 发布的文章

[转]iOS 的多线程同步

转载:iOS 的多线程同步 by zqqf16

我的上一家公司有个引以为豪的技术:多核无锁,不仅避免了各种由锁带来的问题,还极大的提高了性能,所以产品性能能够在业界数一数二。 在这样的氛围影响下,我在开发的时候也很少用锁,能不用就不用。 后来去面试 iOS 开发的时候,面试官总是喜欢问有关于锁的问题,最近趁有时间就整理了一下,算是补充一下技能树吧。

- 阅读剩余部分 -

Threading Programming Guide 4 Synchronization

部分内容来源于:ios多线程同步

Synchronization Tools

Atomic Operations

在多进程(线程)访问资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。原子操作(atomic operation)是不需要synchronized。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。

需要硬件实现,但是维基说可以用其他锁机制软件实现。

- 阅读剩余部分 -

Transitioning to ARC Release Notes

ARC (Automatic Reference Counting)是llvm compiler的特性之一,提供了objective-c对象的自动内存管理功能。它自动在适当的地方插入retianreleaseautorelease方法,配合autoreleasepool使用。启用了ARC之后,将不再能手动使用retianreleaseautorelease方法了。

- 阅读剩余部分 -

Threading Programming Guide 3 Run Loops

iOS线程编程手册-3-Run Loops

Run Loop是和线程关系密切的基础架构,它配合线程实现可循环事件处理机制。Run Loop的设计目的是让线程由事件驱动而运行,没有接收到事件就休眠。

只有主线程才是自带Run Loop光环的,设置主线程的Run Loop是应用程序启动的一部分。其他你自己创建的线程都需要自己写代码来实现Run Loop。Cocoa和Core Foundation都提供了run loop object让你可以方便的创建和管理run loop。

- 阅读剩余部分 -

Threading Programming Guide 2 Thread Management

iOS线程编程手册-2-线程管理

每一个进程(应用程序)都是由一个或者多个线程组成,每一个都有自己的执行路径(path of execution)。每一个应用程序的启动都是从主线程开始,然后再创建和启动其他线程。

当一个进程成功地创建/启动了更加多的线程,这些线程们在同一个进程里面独立的运行。他们有自己的execution stack并且由kernel指定计划在runtime中启动运行。一个线程可以和其他线程通信、可以实施I/O操作和其他任何你想干的事情。又因为他们是在同一个进程里面运行的,所以他们和主线程共享虚拟内存(virtual memory space)和访问权限。

- 阅读剩余部分 -

Threading Programming Guide 1 About Threaded Programming

iOS线程编程手册-1-关于线程编程

虽然有GCD和NSOperation可以高效地实现多线程,但是你也可以使用OS X和iOS提供的底层的线程API。

文档结构

  • About Threaded Programming 介绍线程的概念和在app中的作用
  • Thread Management 介绍OS X中的线程技术和使用方法
  • Run Loops 介绍如何使用响应事件的Run Loop
  • Synchronization 线程同步和操作方式
  • Thread Safety Summary 线程安全相关

- 阅读剩余部分 -

Advanced Memory Management Programming Guide

关于iOS内存管理

该文章包含了一些ARC出现之前的内存管理方法,看完之后去看 《 Transitioning to ARC Release Notes 》可以更加完整地把知识结合起来。

内存管理可以理解为把内存这种有限的资源分配给一个application里面所有代码和数据的动作。

使用Objective-C的时候,内存管理实际上就是对app内使用的Object的关系的管理。因为iOS的内存管理是基于reference counting的。

目标是app占用的内存中不包含任何不需要的object。

- 阅读剩余部分 -

Concurrency Programming Guide 4 Dispatch Queues

Dispatch Queues

type of Dispatch Queues

类型 描述 限制
Serial 也叫private dispatch queue,串行执行queue上的每一个task。 每一个task都在独立的线程里运行,由dispatch queue统一管理。经常用来控制对特定资源的访问(如临界资源)。 木有限制,你可以创建任意多个的serial dispatch queue,他们之间是并行的。
Concurrent 也叫global diapatch queue,并行执行queue里面的每一个task。每一个task都在独立的线程里运行,由dispatch queue统一管理。并行的数量是动态地,由system当前的资源状态决定。 concurrent dispatch queue有四个,由系统提供,根据优先级别区分为default、low、high、background。
Main dispatch queue 这个diapatch queue在main thread里串行执行task。所以这个queue是关联main thread的run loop的,用来执行dispatch source相关的任务。因为该queue在main thread执行task,所以常用作各任务的同步点 全局唯一的特殊serial dispatch queue

- 阅读剩余部分 -

Concurrency Programming Guide 3 Operation Queues

Operation Queues

GCD对比

  1. 稍微慢一点点,因为是NSOperationNSOperationQueue基于GCD的(在Mac OS X v10.6 & iOS 4之后1);

  2. Operation Queue可以实现operation的dependency功能,使之在制定的operation完成之后再运行。而且指定线程可以在不同的operation queue里跑;

  3. 可以重用、取消、暂停operation;

  4. 可以使用KVO,方便监控operation的运行状态;

  5. Operation既可以直接调用start方法独立运行也可以add到operation queue里面跑;

  6. 可以使用setCompletionBlock:设置一个operation执行完之后的动作;

  7. 可以定义operation优先级别setQueuePriority:;

- 阅读剩余部分 -