unix环境 高级编程-线程(1)
线程概念:
典型的unix可以看成只有一个控制线程:一个进程在某一时刻只能做一件事,有了多个控制线程之后,在程序设计时就可以把进程设计成在某一时刻能够不止做一件事,每个线程处理各自独立的任务,这种方法有很多好处:
1.通过为每种事件类型分配单独的处理线程,简化处理异步事件的代码,每个线程在进程事件处理时可以采用同步编程模式,同步编程模式要比异步编程模式简单得多。
2.多个进程必须使用操作系统提供的复杂机制才能实现内存和文件描述符的共享,而多个线程自动地可以访问相同的存储地址空间和文件描述符
3.有些问题可以分解从而提高整个程序的吞吐量。在只有一个控制线程时,一个单线程进程要完成多个任务,只需要把任务串行化,但有多个控制线程时,相互独立的任务处理可以交叉进行,此时只需要为每个任务分配一个单独的进程,当然只有在两个任务的处理过程互不依赖的情况下,两个任务才可以交叉进行。
4.交互的程序同样可以通过使用多线程来改善响应时间,多线程可以把程序中处理用户输入输出的部分与其他部分分开。
有些人把多线程的程序设计与多处理器或多核系统联系起来,但即使程序运行在单处理器下,也能得到多线程编程模型的好处。处理器的数量并不影响到程序结构,程序都可以通过使用线程得以简化。
每个线程都包含表示执行任务环境所必须的信息,包括进程中的线程ID、寄存器的值、栈、调度优先级和策略、环境屏蔽字、errno变量等。一个进程的所有信息对该进程的所有线程都是共享的,包括代码,内存等。
线程标识:
就像每个进程都有一个进程ID一样,每个线程也有一个线程ID,进程ID在整个系统是唯一的,但线程ID不同,线程ID只有在所属的进程中才有意义
进程ID是用pid_t数据类型来表示的,线程ID是用pthread_t数据类型来表示的,具体实现的时候可以用一个结构来代表pthread_t数据类型。所以可移植的操作系统不能把它作为整数处理,因此必须使用一个函数来对两个线程ID进程比较。
线程可以调用pthread_self函数获得自己的线程ID。
主线程可能把工作任务放在一个队列中,用线程ID来控制每个工作线程处理哪些作业,如图所示
主线程将作业放到一个工作队列中,由三个工作线程组成的线程池从队列中移出作业,主线程不允许每个线程任意处理从队列顶端取出的作业,而是由主线程控制作业的分配,主线程会在每个待处理作业的结构中放置处理该作业的线程ID,每个工作线程只能移出标有自己线程ID的作业。
线程创建:
在传统unix模型中,每个进程只有一个控制线程,在创建多个控制线程之前,程序的行为与传统的进程并没有什么区别,新增的线程可以通过调用pthread_cerate函数创建。
当函数成功返回时,新创建线程的线程ID会被设置成tidp指向的内存单元,。
attr参数用于定制各种不同的线程属性。线程创建时并不能保证哪个线程会先运行。
posted on 2016-08-01 21:41 sichenzhao 阅读(112) 评论(0) 编辑 收藏 举报