1. 线程调用函数中使用pthread_self() 获取线程ID,而不是通过pthread_create() 的第一个参数tidp获取线程ID?
受编译器的影响,pthread_create返回的tidp可能在执行线程函数之后返回,从而线程函数获取的tidp不存在。
2. 使用pthread_join 获取线程退出的参数时,需要保证退出的内存没有被改变或者内存回收(参数是全局、静态、malloc或常量)
3. pthread_cancel和pthread_exit 会调用POP函数
pthread_cancel 属于线程取消其他线程的函数,并不等待线程终止,仅仅发送请求
pthread_exit 为本线程的退出函数
pthread_join 可获取线程退出的状态
pthread_detach 线程分离,防止pthread_join堵住线程。使用线程分离,线程退出后自动回收资源,而不是等进程结束后回去,当然不可用pthread_join获取线程退出的状态
4. 读写锁:读任务远大于写任务时,读写锁的性能体现更多明显
互斥锁:死锁-当线程1锁住任务a,获取任务b,而线程2锁住任务b,获取任务a,此时将出现死锁的情况
条件变量:条件变量和互斥结合使用,允许线程以无竞争的方式等待特定事件的发生。互斥锁是为了保护此条件,如果此条件一定满足,则释放互斥锁;如果不满足,则一直锁住该条件。
1 for(;;)
2 {
3 pthread_mutex_lock(&qlock);
4 while (workq == NULL)
5 {
6 pthread_cond_wait(&qready, &qlock);
7 }
8 pthread_mutex_unlock(&qlock);
9 }
10
11 pthread_cond_signal(&qready);