apue 第十一章 线程
2015-07-29 16:01
363 查看
pthread_join(pthread_t tid,void **rval_ptr)
old线程创建了new线程,然后调用pthread_join来等待new线程返回,返回值为*rval_ptr
apue中提到一个线程的分离状态概念:
类比于进程,子进程在退出中,会保留退出状态供父进程调用wait/waitpid获取
对于线程,P318:默认情况下,线程的终止状态会保存知道对该线程调用pthread_join;P312:pthread_join自动把线程置于分离状态
而处于分离状态的线程会由系统回收资源
另:对已处于分离状态的线程(比如在创建时设置属性为分离状态)调用pthread_join,会产生未定义的行为
可以调用pthread_detach(tid)将线程置于分离状态。
pthread_cleanup_push/pthread_cleanup_pop
在网上查到这两个函数是用宏实现的,push函数中有'{',pop函数中有'}',因此一定要成对出现。
push()
/*
代码
*/
pop(execut)
如果线程在push和pop之间以pthread_exit()退出,或者响应其他线程对该线程调用的pthread_cancel退出,会自动调用push建立的清理函数
如果是return则不调用
当线程正常运行到pop时(即没有退出),如果execute为0,则不会调用清理函数,否则调用清理函数。同时,无论是否调用清理函数,pop都会删除与之对应的push函数中建立的清理函数。
互斥锁:pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)初始化,对于静态pthread_mutex_t 还可以赋值为PTHREAD_MUTEX_INITIALIZER进行初始化
pthread_mutex_destroy()销毁
pthread_mutex_lock 加锁
pthread_mutex_unlock 解锁
pthread_mutex_trylock 不阻塞加锁
pthread_mutex_timedlock 带超时的加锁,注意,timespec是绝对时间,如要等待10s,则获取当前时间+10s;
读写锁:pthread_rwlock_init(pthread_rwlock_init *restrict rwlock,pthread_rwlockattr_t *restrict attr)
pthread_rwlock_destroy()
pthread_rwlock_rdlock()/tryrdlock/timedrdlock读锁
pthread_rwlock_wrlock()/trwrlock/timedwrlock写锁
pthread_rwlock_unlock()
条件变量:pthread_cond_init(pthread_cond_t *restrict cond,pthread_condattr_t *restrict attr)
pthread_cond_wait(cond,mutex)/timewait
pthread_cond_signal
传递给wait两个参数,第一个是要等待的条件,第二个是一个已经加锁的互斥锁
wait函数会对mutex解锁,然后等待唤醒
使用这种方式的好处:在判断完某条件不满足时,调用wait函数进行等待,这时加上互斥锁就可以防止在判断完条件之后,调用wai之前,其他线程对条件进行修改。
old线程创建了new线程,然后调用pthread_join来等待new线程返回,返回值为*rval_ptr
apue中提到一个线程的分离状态概念:
类比于进程,子进程在退出中,会保留退出状态供父进程调用wait/waitpid获取
对于线程,P318:默认情况下,线程的终止状态会保存知道对该线程调用pthread_join;P312:pthread_join自动把线程置于分离状态
而处于分离状态的线程会由系统回收资源
另:对已处于分离状态的线程(比如在创建时设置属性为分离状态)调用pthread_join,会产生未定义的行为
可以调用pthread_detach(tid)将线程置于分离状态。
pthread_cleanup_push/pthread_cleanup_pop
在网上查到这两个函数是用宏实现的,push函数中有'{',pop函数中有'}',因此一定要成对出现。
push()
/*
代码
*/
pop(execut)
如果线程在push和pop之间以pthread_exit()退出,或者响应其他线程对该线程调用的pthread_cancel退出,会自动调用push建立的清理函数
如果是return则不调用
当线程正常运行到pop时(即没有退出),如果execute为0,则不会调用清理函数,否则调用清理函数。同时,无论是否调用清理函数,pop都会删除与之对应的push函数中建立的清理函数。
互斥锁:pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)初始化,对于静态pthread_mutex_t 还可以赋值为PTHREAD_MUTEX_INITIALIZER进行初始化
pthread_mutex_destroy()销毁
pthread_mutex_lock 加锁
pthread_mutex_unlock 解锁
pthread_mutex_trylock 不阻塞加锁
pthread_mutex_timedlock 带超时的加锁,注意,timespec是绝对时间,如要等待10s,则获取当前时间+10s;
读写锁:pthread_rwlock_init(pthread_rwlock_init *restrict rwlock,pthread_rwlockattr_t *restrict attr)
pthread_rwlock_destroy()
pthread_rwlock_rdlock()/tryrdlock/timedrdlock读锁
pthread_rwlock_wrlock()/trwrlock/timedwrlock写锁
pthread_rwlock_unlock()
条件变量:pthread_cond_init(pthread_cond_t *restrict cond,pthread_condattr_t *restrict attr)
pthread_cond_wait(cond,mutex)/timewait
pthread_cond_signal
传递给wait两个参数,第一个是要等待的条件,第二个是一个已经加锁的互斥锁
wait函数会对mutex解锁,然后等待唤醒
使用这种方式的好处:在判断完某条件不满足时,调用wait函数进行等待,这时加上互斥锁就可以防止在判断完条件之后,调用wai之前,其他线程对条件进行修改。
相关文章推荐
- C#中Queue<T>类的使用以及部分方法的源码分析
- C#中Queue<T>类的使用以及部分方法的源码分析
- muduo::BlockingQueue、BoundedBlockingQueue分析
- SPOJ 1771 NQUEEN Yet Another N-Queen Problem
- 通用Key-Value存储系统的存储管理策略解析
- Architecture,Valid architectures,Build Active Architecture Only
- 配置文件读取
- UISearchBar 点击取消回到原来位置时会跳动的解决方法
- Maximum Subarray
- Qt 5.3 下OpenCV 2.4.11 开发(3)简单的GUI项目
- Daikon Forge GUI Library(dfgui)之Scroll Panel
- [UIScreen mainScreen].bounds.size获取设备长宽时的问题
- UILable 设置对齐方式扩展
- 用户选择一个value过滤数据
- 初学miniui之miniui的使用
- easyui获取datagrid所有行、变化行、更新行等数据的方法
- Result Maps collection already contains value for
- UIAlertView,POP返回键盘闪现
- Android学习心得(9) --- ndk-build脚本参数用法
- Easyui 中的placeholder属性