在学习linux程序开发的过程中。多线程确是一块硬骨头。而为我们熟知的就是NPTL这套线程库,它已经成为了glibc的一部分。这次我们学习的内容主要包括线程的创建和结束,读取和设置常见的线程属性,以及常见的线程同步方式。
首先要说明的是线程的模型。为我们熟知的有三种线程模型。一个进程可以拥有M个内核线程和N个用户进程,其中M<=N。并且在一个系统所有的进程中,M和N的比值都是固定的。按照M:N的取值,线程的实现方式可以有以下三种:完全在用户空间实现,这里的M=1、完全由内核调度和双层调度。比较这三种模型,双层调度是前两者的综合体,结合了前两种方式的优点:不但不会消耗太多的内核资源,而且线程的切换速度也较快,同时它充分利用了多处理器的优势。
言归正传:
首先所有的相关方法在头文件<pthread.h>中有申明。
创建线程我们使用pthread_create方法,int pthread_create(pthread_t* thread,const pthread_attr_t* attr,void* (*start_routine)(void*),void* arg);
参数分别是线程号地址,传入的线程属性,回调函数的地址,以及参数。成功创建返回0,失败时返回错误码。
线程的退出可以使用pthread_exit(void* retval);干净利落地退出,retval可以向线程的回收者返回信息。
pthread_join(pthread_t thread,void** retval);可以回收其他线程,类似于回收进程的wait和waitid系统调用。
异常终止一个线程可以使用pthread_cancel方法。具体的使用方法可以使用man工具查询,教程挺详细的。