您的位置:首页 > 产品设计 > UI/UE

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之前,其他线程对条件进行修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: