第11章线程总结

1 线程标识

 pthread_t类型

int pthread_equal(pthread_t tid1,pthread_t tid2)

pthread_t pthread_self()

2 创建线程

int pthread_create(pthread_t *tid,pthread_attr_t *attr,void *(*start_rtn)(void *),void *arg)

 tid保存线程id,attr描述线程属性,start_rtn为线程起始函数(参数和返回值都是void *),arg是传递给起始函数的参数 

 新创建线程和调用线程的执行顺序是不确定的,新创建线程继承调用线程的信号屏蔽字,但是清除未决信号

3 终止线程

 三种方式:

 1)从启动例程返回 return

 2)被其他线程取消pthread_cancel

int pthread_cancel(pthread_t tid)

 3)调用pthread_exit

void pthread_exit(void *rval)

 rval可以被其他线程通过pthread_join捕捉到:

int pthread_join(pthread_t tid,void **rval)

 调用线程将等待tid线程终止,并试图获取其返回码(终止码)

 清理函数:

void pthread_cleanup_push(void (*rtn)(void *),void *arg)
void pthread_cleanup_pop(int execute)

4 线程同步

 1)互斥量

互斥量:pthread_mutex_t

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr)
int pthread_mutex_destroy(pthread_mutex_t *mutex)

int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)

 2)读写锁

 与互斥量的区别在于:多线程共享读锁,独占写锁

读写锁:pthread_rwlock_t

int pthread_rwlock_init(pthread_rwlock_t *rwlock,pthread_rwlockattr_t *attr)
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock)

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)

int pthread_rwlock_tyrrdlock(pthread_rwlock_t *rwlock)
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)

 3)条件变量  

 条件变量提供了线程会合的场所,允许线程以无竞争的方式等待某个条件的发生

 条件变量受互斥量保护,获取互斥量的线程A可以调用pthread_cond_wait(&cond,&mutex)

 A线程被放到条件变量的线程列表上,对互斥量解锁,进入休眠状态等待条件发生

 其他线程获取互斥量,一定条件下调用pthread_cond_signal(&cond)或pthread_cond_broadcast(&cond)函数,然后释放互斥量

 A线程pthread_cond_wait函数返回,并重新获取互斥量

条件变量:pthread_cond_t

int pthread_cond_init(pthread_cond_t *cond)
int pthread_cond_destroy(pthread_cond_t *cond)

int pthread_cond_wait(ptherad_cond_t *cond,pthread_mutex_t *mutex)
int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,struct timespec *timeout)

int pthread_cond_signal(pthread_cond_t *cond)
int pthread_cond_braodcase(pthread_cond_t *cond)

 获取互斥量的线程通过调用pthread_cond_wait、pthread_cond_timedwait函数,将线程放到等待条件的线程列表上,释放互斥量并休眠等待

 之后获取互斥量的线程可以在条件发生时调用pthread_cond_signal、pthread_cond_broadcast函数,当线程释放互斥量时,等待条件的线程列表上的线程可以从pthread_cond_wait函数返回并重新获取互斥量

时间: 2024-10-14 10:36:36

第11章线程总结的相关文章

apue读书笔记 - 第11章 线程

实例11-1 为在Ubuntu12.04上的运行结果与书中描述的不一致呢? 从pid来看这两个线程属于同一个进程,且线程ID也是指针形式的,Google后得知,书上讲的是以前的LinuxThreads实现,现在linux使用NPTL线程. 参考:Linux 线程模型的比较:LinuxThreads 和 NPTL 习题11.4 在回答该问题之前,我觉得得先弄清楚"互斥量"与"条件变量"之间的关系.因为书上说这两者一般是配套使用的. 考虑如下情况: 子线程B和子线程C都

UNIX环境高级编程第11章线程

程序清单11-1打印线程ID // threads/threadid.c 11-1 #include "apue.h" #include <pthread.h> pthread_t ntid; void printids(const char* s) { printf("%d ", (unsigned int)ntid); printf("%ld ", (unsigned long)ntid); pid_t pid; pthread_

《Unix环境高级编程》读书笔记 第11章-线程

1. 引言 了解如何使用多个控制线程在单进程环境中执行多个任务. 不管在什么情况下,只要单个资源需要在多个用户键共享,就必须处理一致性问题. 2. 线程概念 典型的Unix进程可以看成只有一个控制线程:一个进程在某一时刻只能做一件事情. 多线程带来的好处: 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码.每个线程在进行事件处理时可以采用同步编程模式. 多个进程必须使用操作系统提供的复制机制才能实现内存和文件描述符的共享.而多个线程自动地可以访问相同的存储空间和文件描述符. 有些

第11章 Windows线程池(1)_传统的Windows线程池

第11章 Windows线程池 11.1 传统的Windows线程池及API 11.1.1 传统的线程池对象及对应的API 线程池对象 API 普通任务线程池 QueueUserWorkItem 计时器线程池 CreateTimerQueue(创建线程池) CreateTimerQueueTimer(创建计时器) ChangeTimerQueueTimer DeleteTimerQueueTimer DeteTimerQueueEx 同步对象等待线程池 RegisterWaitForSingle

《Android开发艺术探索》第11章 Android的线程和线程池

第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作.线程的创建和销毁的开销较大,所以如果一个进程要频繁地创建和销毁线程的话,都会采用线程池的方式.(2)在Android中除了Thread,还有HandlerThread.AsyncTask以及IntentService等也都扮演着线程的角色,只是它们具有不

第一章线程管理

Java 7 并发编程实战手册目录 代码下载(https://github.com/Wang-Jun-Chao/java-concurrency) 第一章线程管理 1.1简介 在计算机领域中,我们说的并发(Concurrency)是指一系列任务的同时运行.如果一 台电脑有多个处理器或者有一个多核处理器,这个同时性(Simultaneity)是真正意义的并 发:但是一台电脑只有一个单核处理器,这个同时性并不是真正的并发 与并发相关的另一个概念是并行(Parallelism).与并发有不同的定义一样

[转]MySQL性能调优与架构设计&mdash;&mdash;第11章 常用存储引擎优化

第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处.如何将各种存储引擎在自己的应用环境中结合使用,扬长避短,也是一门不太简单的学问.本章选择最为常用的两种存储引擎进行针对性的优化建议,希望能够对读者朋友有一定的帮助. 11.1 MyI SAM存储引擎优化 我们知道,MyISAM存储引擎是MySQL最为古老的存储引擎之一,也是最为流行的存储引擎之一.对

《UML精粹》第11章 互动图

第11章 活动图 活动图是一种表述过程机理.业务过程以及工作流的技术.在很多方面,它们所起的作用域流程图类似,但是,与流程图表示法的主要区别是,活动图支持并行行为. 下图表示活动图的一个简例.我们在初始节点动作初开始,随后做订单动作,完成后,便遇上一个分岔.分岔(fork)有一个人流和几个并发的出流. 上图说的是,按订单供货.开发票以及它们的后继动作都是并行发生的.本质上这意味着它们之间的顺序无关紧要.我可以按订单供货,开发票,交付,然后再收款:或者也可以开发票,收款,按订单供货,然后再交付.

MySQL性能调优与架构设计——第11章 常用存储引擎优化

第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处.如何将各种存储引擎在自己的应用环境中结合使用,扬长避短,也是一门不太简单的学问.本章选择最为常用的两种存储引擎进行针对性的优化建议,希望能够对读者朋友有一定的帮助. 11.1 MyI SAM存储引擎优化 我们知道,MyISAM存储引擎是MySQL最为古老的存储引擎之一,也是最为流行的存储引擎之一.对