什么是线程:线程是进程内部的一条执行路径,是系统调动的基本单位,每个进程至少有一条线程,称之为主线程。
由于线程是进程内部的一条执行路径,所以一个进程中的所有线程共享全局、堆数据,包括打开的文件描述符,只有每个线程栈区的数据是线程独享的。
线程的实现方式有三种模式分别为用户级、内核级、混合模式。接下来分别介绍着山中实现方式。
用户级:线程的创建、销毁、管理都是在用户空间完成的,由用户管理,不由内核管理。
优点:灵活性高,不知道线程的存在,任何平台都可以运行。线程切换快,线程切换在用户空间完成,不需要陷入内核。
缺点:编程复杂,用户必须自己管理线程,包括线程的调度;如果一个线程阻塞,整个进程都会阻塞;不能使用对称多处理器。
内核级:线程的创建、销毁、管理都是有内核来完成的。
优点:内核线程使得用户编程简单
缺点:每次切换都得切入内核,所以效率极低。
混合模式:一部分一用户级线程创建、一部分由内核创建,是一个多对多的关系,结合用户级和内核级的优点。
线程的使用:
线程库包含在头文件pthread.h中。
线程的创建:
int pthread_create(pthread_t *id,pthread_attr_t *arr,void*(*pthread_fun)(void*),void*arg)
线程从pthread_fun函数入口地址开始执行,到pthread_fun 函数结束。arg 参数为给pthread_fun 函数传递参数,attr 为线程的属性。
pthread_create函数成功返回 0,失败返回错误码。
线程结束:
Int pthread_exit(void *)
线程结束默认调用exit函数,这个函数会结束进程。进程结束,所有的线程也会随之结束。
等待线程结束:
Int pthread_join(pthread_t id,void **)
终止一个线程
int pthread_cancl(pthread_t id)