介绍 什么是线程 线程的优点是什么介绍 什么是线程 线程的优点是什么 线程在Unix系统下 通常被称为轻 级的进程 线程虽然 是进程 但却可以看作是Unix进程的表亲 同 一进程中的多条线程将共享该进程中的全部系统资源 如虚拟地址空间 文件描述符和信号处理等等共享该进程中的全部系统资源 如虚拟地址空间 文件描述符和信号处理等等 但 同一进程中的多个线程有各自的调用栈有各自的调用栈 call stack 自己的寄存器环境 自己的寄存器环境 register context 自己的线程 自己的线程 本地存储本地存储 thread local storage 一个进程可以有很多线程 每条线程并行执行 同的任务 线程可以提高应用程序在多核环境下处理诸如文件I O或者socket I O等会产生堵塞的情况的表现性能 在 Unix系统中 一个进程包含很多东西 包括可执行程序以及一大堆的诸如文件描述符地址空间等资源 在 很多情况下 完成相关任务的 同代码间需要交换数据 如果采用多进程的方式 那么通信就需要在用户 空间和内核空间进行频繁的切换 开销很大 但是如果使用多线程的方式 因为可以使用共享的全局变 所以线程间的通信 数据交换 变得非常高效 Hello World 线程创建 结束 等待 线程创建 结束 等待 创建线程创建线程 pthread create 线程创建函数包含四个变 分别为 1 一个线程变 名 被创建线程的标识 2 线程的属性指针 缺省为 NULL即可 3 被创建线程的程序代码 4 程序代码的参数 For example pthread t thrd1 pthread attr t attr void thread function void argument char some argument pthread create 结束线程结束线程 pthread exit 线程结束调用实例 pthread exit void retval retval用于存放线程结束的退出状态 线程等待线程等待 pthread join pthread create调用成功以后 新线程和 线程谁先执行 谁后执行用户是 知道的 这一块取决与操作系 统对线程的调度 如果我们需要等待指定线程结束 需要使用pthread join函数 这个函数实际上类似与多 进程编程中的waitpid 举个例子 以下假设 A 线程调用 pthread join 试图去操作B线程 该函数将A线程 阻塞 直到B线程退出 当B线程退出以后 A线程会收集B线程的返回码 该函数包含两个参数 pthread t th th是要等待结束的线程的标识 void thread return 指针thread return指向的位置存放的是终止线程的返回状态 调用实例 pthread join thrd1 NULL example1 1 2 F i l e N a m e t h r e a d h e l l o w o r l d c 3 A u t h o r c o u l d t t f y b y 4 M a i l f u y u n b i y i g m a i l c o m 5 C r e a t e d T i m e 2 0 1 3 1 2 月1 4 日 星期六 1 1 时4 8 分5 0 秒 6 7 8 i n c l u d e 9 i n c l u d e 1 0 i n c l u d e 1 1 1 2 v o i d p r i n t m e s s a g e f u n c t i o n v o i d p t r 1 3 1 4 i n t m a i n 1 5 1 6 i n t t m p 1 t m p 2 1 7 v o i d r e t v a l 1 8 p t h r e a d t t h r e a d 1 t h r e a d 2 1 9 c h a r m e s s a g e 1 t h r e a d 1 2 0 c h a r m e s s a g e 2 t h r e a d 2 2 1 2 2 i n t r e t t h r d 1 r e t t h r d 2 2 3 2 4 r e t t h r d 1 p t h r e a d c r e a t e 成功返回0 失败返回 1 参数 sem 指向信号 结构的一个指针 pshared 是0的时候 该信号 在进程间共享 否则只能为当前进程的所有线程们共享 value 信号 的初始值 信号 减1操作 当sem 0的时候该函数会堵塞 int sem wait sem t sem 成功返回0 失败返回 1 参数 sem 指向信号 的一个指针 信号 加1操作 int sem post sem t sem 参数与返回同上 销毁信号 int sem destroy sem t sem 参数与返回同上 代码示例代码示例 1 2 F i l e N a m e s e m c 3 A u t h o r c o u l d t t f y b y 4 M a i l f u y u n b i y i g m a i l c o m 5 C r e a t e d T i m e 2 0 1 3 1 2 月1 5 日 星期日 1 9 时2 5 分0 8 秒 6 7 8 i n c l u d e 9 i n c l u d e 1 0 i n c l u d e 1 1 i n c l u d e 1 2 1 3 d e f i n e M A X S I Z E 1 0 1 4 1 5 i n t s t a c k M A X S I Z E 1 6 i n t s i z e 0 1 7 s e m t s e m 1 8 1 9 生产者 2 0 v o i d p r o v i d e d a t a v o i d 2 1 i n t i 2 2 f o r i 0 i M A X S I Z E i 2 3 s t a c k i i 2 4 s e m p o s t s e m 为信号 加1 2 5 2 6 2 7 2 8 消费者 2 9 v o i d h a n d l e d a t a v o i d 3 0 i n t i 3 1 w h i l e i s i z e M A X S I Z E 3 2 s e m w a i t s e m 3 3 p r i n t f 乘法 d X d d n s t a c k i s t a c k i s t a c k i s t a c k i 3 4 s l e e p 1 3 5 3 6 3 7 3 8 i n t m a i n v o i d 3 9 4 0 p t h r e a d t p r o v i d e r h a n d l e r 4 1 4 2 s e m i n i t s e m 0 0 信号 初始化 4 3 p t h r e a d c r e a t e p r o v i d e r N U L L v o i d h a n d l e d a t a N U L L 4 4 p t h r e a d c r e a t e h a n d l e r N U L L v o i d p r o v i d e d a t a N U L L 4 5 p t h r e a d j o i n p r o v i d e r N U L L 4 6 p t h r e a d j o i n h a n d l e r N U L L 4 7 s e m d e s t r o y s e m 销毁信号 4 8 4 9 r e t u r n 0 5 0 运行结果 运行结果 因为信号 机制的存在 所以代码在handle data的时候 如果sem wait sem 时 sem为0 那么代码会堵 塞在sem wait上面 从而避免 在stack中访问错误的index而使整个程序崩溃
展开阅读全文