线程(thread)与进程类似,但是创建一个线程是进程的10倍甚至更多,一个进程可以包括多个线程,多线程可以执行多个任务,且每个线程之间都可以执行独立的任务。
注意:线程之间是共享同一个全局内存区域的,包括数据段,堆,栈;同时还包括一下内容:
- 1:进程的ID;
- 2:控制终端;
- 3:用户ID和组ID;
- 4:打开的文件描述符;
- 5:资源限制;
- 6:间隔定时器(setitimer())和POSIX定时器(timer_create();
- 7:信号处置;
线程数据类型:
pthread_t | 线程ID |
pthread_mutex_t | 互斥对线 |
pthread_mutexattr_t | 互斥属性对象 |
pthread_cond_t | 条件变量 |
pthread_condattr_t | 条件变量的属性对象 |
pthread_attr_t | 线程的属性对象 |
线程创建:
#include<pthread.h>
int pthread_create((pthread_t *thread, pthread_attr_t *attr, void *(*start)(void *), void *arg)
参数thread:线程id
attr: 线程属性设置
第三个参数:线程处理函数
arg:传递给线程处理函数的参数(任意对象类型的指针传递给start()函数,也可设置为空)
返回值不为0时,代表创建线程失败。
————————————————
线程终止:
- 线程执行函数start执行return语句结束;
- 线程调用pthread_exit()函数退出;//---》pthread_exit()终止线程,返回值可以由另一线程通过pthread_join()来获取
void pthread_exit(void *retval)
- 调用pthread_cancel()取消线程
- 任意线程调用exit(), 终止所有线程;
线程ID可以同过pthread_self()来获取;
线程连接函数
int pthread_join(pthread_t thread, void **retval);
--retval如果不为NULL, 则为return或pthread_exit()所指定的值
线程结束后必须释放其线程资源,如果没有主动释放线程资源,等待系统自动回收, 可能会造成创建新线程失败。
pthread_join()函数会阻塞等待线程结束,然后才会释放线程资源,防止产生僵尸线程。
也可以使用在线程执行函数种添加pthread_detach(pthread_self())自行分离函数,通常使用第二种。