APUE读书笔记-第11章-线程

来源:互联网 发布:linux新建文件命令 编辑:程序博客网 时间:2024/04/30 10:55

11.1 引言

*一个进程中的所以线程都可以访问该进程的组成部件,如文件描述符和内存

*无论何时,只要单个资源需要在多个用户间共享,就必须处理一致性问题

*同步机制用以防止多个线程查看到不一致的共享资源


11.2 线程概念

*典型的UNIX进程可以看成只要一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制县城以后,在程序设计时可以把进程设计成在同一时刻能够做不止一件事,每个线程处理各自独立的任务

*多线程的好处包括:

(a)通过为每种事件类型的处理分配单独的线程,能够简化处理异步事件的代码

(b)多个进程必须使用操作系统提供的复杂机制才能实现内存和文件描述符的共享。而多个线程自动地可以访问相同的存储地址空间和文件描述符

(c)有些问题可以通过将其分解从而改善整个程序的吞吐量

(d)交互的程序同样可以通过多线程实现响应时间的改善,多线程可以把程序中处理用户输入输出的部分与其他部分分开

*线程包含了表示进程内执行环境必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据


11.3 线程标识

*int pthread_equal(pthread_t tid1,pthread_t tid2);用于对两个线程ID进行比较

*pthread_t pthread_self(void*);用于获得自身的线程ID


11.4 线程创建

*线程创建时并不能保证在哪个线程会先运行:是新创建的线程还是调用线程。新创建的线程可以访问进程的地址空间,并且调用线程的浮点环境和信号屏蔽字,但是该线程的未决信号集被清除

*Linux的线程实现:Linux使用clone系统调用来实现pthread_create。clone系统调用创建子进程,这个子进程可以共享父进程一定数量的执行环境(如文件描述符和内存),这个数量是可配置的


11.5 线程终止

*如果进程中的任一线程调用了exit,Exit或者_exit,那么整个进程就会终止

*单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。

(a)线程只是从启动例程中返回,返回值是线程的退出码

(b)线程可以被同一进程中的其他线程取消

(c)线程调用pthread_exit

void pthread_exit(void *rval_ptr)

*rval_ptr是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针

int pthread_join(pthread_t thread,void **rval_ptr)

调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消

*进程中的其他线程可以通过调用pthread_join函数获得该线程的退出状态

*pthread_create 和pthread_exit函数的无类型指针参数能传递的数值可以不止一个,该指针可以传递包含更复杂信息的结构的地址,但是注意这个结构所使用的内存在调用者调用完成以后必须仍然是有效的,否则就会出现无效或非法内存访问

*解决线程间栈的覆盖问题:可以使用全局结构或者用malloc函数分配结构

*线程可以通过调用pthread_cancel函数来请求取消同一进程中的其他线程。线程可以选择忽略取消方式或是控制取消方式


11.6 线程同步

*互斥变量用pthread_mutex_t数据类型来表示,在使用互斥变量一起,必须首先对它进行初始化,可以把它设置为常量PTHREAD_MUTEX_INITIALIZER(只对静态分配的互斥量),也可以通过调用pthread_mutex_init函数进行初始化。如果动态地分配互斥量(例如通过调用malloc函数),那么在释放内存前需要调用pthread_mutex_destroy

*读写锁有三种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态

*读写锁也叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的

*条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所

*有了两个函数可以用于通知线程条件已经满足。pthread_cond_signal函数将唤醒该条件的某个线程,而pthread_cond_broadcast函数将唤醒等待该条件的所有线程

原创粉丝点击