apue 第十一章 线程

本文详细介绍了APUE中关于线程的内容,包括pthread_join函数的作用,线程的分离状态及其影响,pthread_cleanup_push和pthread_cleanup_pop的使用,以及互斥锁和读写锁的概念和操作。同时,提到了条件变量pthread_cond_wait、pthread_cond_signal的使用场景,强调了在多线程同步中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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之前,其他线程对条件进行修改。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值