一、线程概述
前面讲到,进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时需要有比较复杂的上下文切换等动作。为了进一步减少处理机的空转时间,支持多处理器以及减少上下文切换开销,进程在演化过程中出现了另一个概念——线程。它是进程内独立的一条运行路线、处理器调度的最小单元,也可以称之为轻量级进程。线程可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享。因此线程的上下文切换开销比创建进程小很多。
一个进程可以有多个线程,也就是多个线程共享一个进程的资源和地址空间。因此,任何线程对系统资源的操作都会给其他线程带来影响。所以,在多线程编程中同步是非常重要的。
二、线程编程
1.线程基本编程
(1)函数说明
(1) pthread_create():创建线程 |
(2) pthread_exit():线程退出 |
(3) pthread_join():将当前线程挂起并等待线程结束,线程结束时资源被收回 |
(4) pthread_cancel():用于同一进程内一个线程要终止另一个线程,被终止的线程要调用以下两个函数 |
(5) pthread_setcancel():设置线程是否可以被其他线程调用pthread_cancel函数取消/终止。 |
(6) pthread_setcanceltype():设置当前线程的“可取消类型”,并且将先前的类型返回到oldtype引用中。 |
(2)函数格式
所需头文件 | #include <pthread.h> |
---|---|
函数原型 | int pthread_create((pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)),void *arg) |
函数传入值 | thread:线程标识符 |
attr:线程属性设置,通常取为NULL | |
start_routine:线程函数的起始地址,是一个以指向void的指针作为参数和返回值的函数指针 | |
arg:传递给start_routine的参数 | |
函数返回值 | 成功:0 |
出错:返回错误码 |
所需头文件 | #include <pthread.h> |
---|---|
函数原型 | void pthread_exit(void *retval) |
函数传入值 | retval:线程结束时的返回值,可由其他函数如pthread_join()来获取 |
所需头文件 | #include <pthread.h> |
---|---|
函数原型 | int pthread_join((pthread_t th,void **thread_return)) |
函数传入值 | th:等待线程的标识符 |
thread_return:用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时) | |
函数返回值 | 成功:0 |
出错:返回出错码 |