Linux线程编程.ppt_第1页
Linux线程编程.ppt_第2页
Linux线程编程.ppt_第3页
Linux线程编程.ppt_第4页
Linux线程编程.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux 线程编程,liang 2010.11.6,Outline,Multithreads programming on Linux Concept/API/Usage/Notes,Threads: concept,线程和进程 进程是资源管理的最小单位(CPU, MEM,FILES, SIGNALS,IO,.) 静态 线程是程序执行的最小单位,是包含在进程中的一种实体(指令IR,stack / 可同步的(JOINABLE)或可脱离的DETACH int _schedpolicy; /主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时

2、、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效 struct _sched_param _schedparam;/仅对RR 或FIFO有效 int _inheritsched; /显示指定调度策略和参数或继承调用者线程的值 int _scope;/竞争范围, SYSTEM: 系统; PROCESS:本进程 线程堆栈等数据,Pthread API 创建线程(2),当创建线程成功时,函数返回0,若不为0 则说明创建线程失败,常见的错误返回代码为EAGAIN 和EINVAL 前者表示系统限制创建新的线程,例如线程数目过多了; 后者表示第二个参数代表的线程属性值非法。,

3、Pthread API 取消线程,通过另外一个线程发出取消请求来终止一个线程 取消点 线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。 pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait() 其它调用可加pthread_testcancel(),Pthread API 取消线

4、程2,int pthread_cancel(pthread_t thread) 发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。 int pthread_setcancelstate(int state, int *oldstate) 设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和 PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为 NULL则存入原来的Cancel状态以便恢复。 int

5、 pthread_setcanceltype(int type, int *oldtype) 设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和 PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和 立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。 void pthread_testcancel(void) 检查本线程是否处于Canceld状态,如果是,则进行取消动作,否则直接返回 注意: 小心使用pthread_can

6、cel API, 尤其是异步取消类型,否则处理不好可能会引起死锁 pthread_cleanup_push /pop定义回调函数处理意外,Pthread API 同步和终止线程,pthread_exit会调用线程清理函数(与return相比): void pthread_exit(void *retval) 等待线程终止并回收资源: int pthread_join(pthread_t th, void *thread_return) 一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join 的线程则返回错误代码ESRCH。 自行释放资源: int pt

7、hread_detach(pthread_t th) 注: 不管是detachable或是joinable线程,如果主线程调pthread_exit()退出,这些线程都会一直执行到结束才会退出。否则(主线程return), 所有线程会自动中止当主线程退出。,Pthread API 函数和变量重入,许多函数包括系统调用是不可重入的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。 在函数中声明的静态变量常常会带来一些问题,函数的返回值也会有问题。 因为如果返回的是函数内部静态声明的空间的地址,则在一个线程调用该函数得到地址后使用该地址指向的数据时,别的线程可能调用此函数并修改了这一段数

8、据,Pthread API 私有数据TSD,TSD: Thread Specific Data 通过一个所有线程可访问的全局变量实现 每个线程的数据是私有的 Usage: 每个线程维护一个链表,对链表的操作是相同的. 创建:int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *) 删除: int pthread_key_delete(pthread_key_t key) 最大PTHREAD_KEYS_MAX(1024) 注: 没有太大意义,等价于应用程序维护一个每个线程只访问自己数据的全局变量 注: e

9、rrno是一种特殊的TSD变量,Pthread API 互斥锁(创建),动态创建: pthread_mutex_init() int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) 其中mutexattr用于指定互斥锁属性, NULL则使用缺省属性 静态创建 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;,Pthread API 互斥锁(销毁),pthread_mutex_destroy()用于注销一个互斥锁, API定义如下: i

10、nt pthread_mutex_destroy(pthread_mutex_t *mutex) 销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。,Pthread API 互斥锁(属性),pthread_mutexattr_t PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。 PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解

11、锁时重新竞争。 PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。 PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。,Pthread API 互斥锁(属性),int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_unlock(pthread_mutex_t *mutex) int pt

12、hread_mutex_trylock(pthread_mutex_t *mutex) 注意: 不是取消点,Posix API 读写锁,读写锁是从互斥锁中发展下来的,互斥锁会将试图访问我们定义的保护区的所有进程都阻塞掉,但读写锁与此不同,它会将访问中的读操作和写操作区分开来对待,它所遵循的规则如下:,Posix API 读写锁(2),只要没有进程持有某个给定的读写锁用于写,那么任意数目的线程都可以持有该读写锁用于读。 仅当没有线程持有某个给定的读写锁用于读或写,才能分配该读写锁用于写。 在某些读数据比改数据频繁的应用中,读写锁将会比互斥锁表现出很大的优越性 读优先还是写优先: 可设置 API:

13、 TYPE: pthread_rwlock_t pthread_rwlock_init pthread_rwlock_rdlock pthread_rwlock_wrlock pthread_rwlock_unlock pthread_rwlock_destroy,Posix API 读写锁(3)记录锁,记录锁实际上是读写锁的一种扩展类型。读写锁是作为数据类型pthread_rwlock_t的变量在内存中分配的。 - 当读写锁是在单个进程内的各个线程间共享时,这些变量可以在那个进程内; - 当读写锁是在共享某个内存区的进程间共享时,这些变量应该在该共享内存区中。,Posix API 读写锁(4

14、)记录锁,记录上锁的基本原理与读写锁不同,记录锁可用于有亲缘关系的或无亲缘关系的进程之间共享某个文件的读与写。 被锁住的文件通过其描述符访问,执行上锁操作的函数是fcntl。 这种类型的锁通常是在内核中维护的,其属性主标识为fcntl调用进程的进程ID。 这意味着这些锁用于不同的进程间的上锁,而不是用于同一进程内不同线程间的上锁,Posix API 读写锁(4)记录锁(2),记录锁分为读取锁和写入锁, 读取锁又称为共享锁,可以使多个进程都能够在文件的同一部分建立读取锁。 写入锁又称为互斥锁, 在任何时刻只能有一个进程在文件的某个部分建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。

15、 API: int fcntl(int fd, int cmd, struct flock *lock);,Pthread API 条件变量,条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作: 一个线程等待“条件变量的条件成立”而挂起; 另一个线程使条件成立(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。,Pthread API 条件变量(创建/注销),静态创建 pthread_cond_t cond=PTHREAD_COND_INITIALIZER 动态创建 int pthread_cond_init(pthread_cond_t *con

16、d, pthread_condattr_t *cond_attr) 注销 pthread_cond_destroy(),Pthread API 条件变量(等待),无条件等待: int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) int 计时等待pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) 注意: abstime为绝对时间(time() Mutex用来防止wa

17、it的竞争条件,Pthread API 条件变量(激发),激发条件有两种形式,pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时按入队顺序激活其中一个; pthread_cond_broadcast()则激活所有等待线程。,POSIX API 信号量,灯亮则意味着资源可用,灯灭则意味着不可用。如果mutex和condition同步方式侧重于等待操作,即资源不可用的话,信号灯机制则侧重于点灯,即告知资源可用;没有 等待线程的解锁或激发条件都是没有意义的,而没有等待灯亮的线程的点灯操作则有效,且能保持灯亮状态。当然,这样的操作原语也意味着更多的开销。,POSIX

18、 API无名信号量(创建),int sem_init(sem_t *sem, int pshared, unsigned int value) 这是创建信号灯的API,其中value为信号灯的初值,pshared表示是否为多进程共享而不仅仅是用于一个进程。LinuxThreads没有实现 多进程共享信号灯,因此所有非0值的pshared输入都将使sem_init()返回-1,且置errno为ENOSYS。初始化好的信号灯由sem变 量表征,用于以下点灯、灭灯操作。,POSIX API无名信号量(销毁),int sem_destroy(sem_t * sem) 被注销的信号灯sem要求已没有线程在等待该信号灯,否则返回-1,且置errno为EBUSY。除此之外,LinuxThreads的信号灯注销函数不做其他动作。,POSIX API: 无名信号量(点灯和灭灯),用完了,加一: int sem_post(sem_t * sem) 要使用,减一: int sem_wait(sem_t * sem) int sem_trywait(sem_t * sem) 获取灯值: int sem_getvalue(sem_t * sem, int * sval

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论