多线程编程(一)

多线程应用程序中的常用术语

程序(program)只是一组指令的有序集合。

任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现。

进程(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。

进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。

在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

线程(tread)则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。

  一个进程和一个线程最显著的区别是:线程有自己的全局数据。线程存在于进程中,因此一个进程的全局变量由所有的线程共享。由于线程共享同样的系统区域,操作系统分配给一个进程的资源对该进程的所有线程都是可用的,正如全局数据可供所有线程使用一样 

线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性

引入线程的好处

(1)易于调度。

(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

(3)开销少。创建线程比创建进程要快,所需开销很少。。

(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

Operation objects

ox x v10.5引入这一概念,一个operation 对象就是一个任务的封装,通常在二级线程中执行。这个封装隐藏了任务的线程管理,从而让你有更多的精力专注在任务本身的实现上。通常情况下,你会和operation queue对象一同使用这些对象。operation queue用来管理在一个或者多个线程上运行operation objects。

Grand Central Dispatch (GCD)

在mac os xv10.6引入的这一概念,Grand Central Dispatch 是另外一个管理线程的封装器。通过gcd,可以定义需要执行的任务并且将任务添加到队列中。这个队列会负责在合适的线程中执行你的任务。

Idle-time notifications

对于轻量级和优先级比较低的任务,idle time notifications 会在你的应用程序比较繁忙的时候一次执行一个任务。cocoa提供了NSNotificationQueue来支持idle-time notifications。通过post一个NSPostWhenIdle选项的NSNotificationQueue就可以请求到一个idle-time notification。队列直到run loop idle状态时才会delivery这个notification 对象。

Asynchronous functions

系统接口包含多个异步的方法来提供自动并发机制。这些api可以使用系统操作来创建自定义的线程执行他们的task并且将结果返回。

Timers

你可以在你的应用程序主线程使用timers。

Separate processes

尽管比较起线程更加的重量级,创建独立的进程有时候还是非常有用的。比如你可能需要大量内存或者必须执行root 权限的时候,例如,你可能会使用一个64位的server来计算大数据,但是应用程序却是32位的来用于想用户展示数据。

Threading Packages

在ios的开发中有常见的三种形式的多线程技术,但是一般较少直接用到

1. Cocoa threadsCocoa 使用的NSThread类

2. POSIX threads 提供基于c的创建线程的接口。如果没有写过cocoa应用程序,这个是最好的创建线程的方式。

3. Multiprocessing Services 基于c的接口。这个技术只有在os x中才可以使用,你应该使用NSThread或者POSIX threads.

Run Loops

一个run loop用来管理一个线程中的异步到达的事件。当有事件时,系统会唤醒线程并且把事件派发到run loop中。run loop会把这些事件派发到你特定的handlers。如果没有事件,那么run loop就会使线程休眠。

为了配置一个run loop,你需要做的就是加载你的线程,获取线程的run loop对象引用,安装事件句柄,然后告知run loop运行。如果你想创建一个长寸的二级线程,那么你就必须要为这些线程配置run loop。

Synchronization Tools

这里的同步工具实际上指的就是lock,线程锁。目的就是防止多个线程同一时间对同一资源做修改,从而导致资源读取出来的有错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值