线程:Thread
基本概念:
(1) 线程是比进程更小的活动单位。它是进程中的一个执行路径(执行分子),
线程也是并发的一种情形。
(2) 进程的内部可以有多个线程,它们并发执行,但是进程内部所有的线程
共享整个进程的地址空间。
(3) main函数, 进程的一个主线程。
进程的指令部分分成多个 线程去并发执行。
线程特点:
(1) 创建一个线程比创建一个进程的开销要小得多
因为创建一个线程,不需要拷贝进程得地址空间。
(2) 实现线程间的通信十分方便.
因为一个进程内部所有的线程直接共享整个进程的地址空间
(3) 线程也是一个动态的概念。
线程的状态图 Ready ---- Running ------- Blocking
(4) 自从有了线程之后,
系统调度的单位是以线程为单位
资源分配的单位还是进程。
线程函数
线程是进程内的一个指令的执行分支,多个线程,就是多个指令序列并发
执行。指令必须是在函数的内部,线程的指令部分肯定也是在函数的内部。
这个函数,我们就称之为"线程函数": 一个线程创建后,要执行的指令全部
在该函数内。这个线程函数执行完毕,线程的任务也就结束啦。
线程函数的原型:
(1) 返回一个(void *) 指针作为返回值的类型。
(2) 带一个(void*)指针作为参数。
定义一个指针,指向一个线程函数:
typedef void* (*start_routine_t) (void*)
如:
void * my_thread_func(void* arg)
{
//要执行的任务/指令
}
linux中pthread的接口函数
(1) 创建一个线程: pthread_create
线程有一个线程ID(tid, thread id), 类似于进程的ID(pid),用来唯一
标识一个线程的。在pthread中,用类型pthread_t来描述一个线程的ID.
pthread_t t1;
#include <pthread.h>
函数:
int pthread_create(pthread_t *tid, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
tid:执行的空间,用来保存新创建的线程的ID的。
attr: 指定线程的属性的。一般是为NULL =》采用默认属性
start_routine:指向线程对应的线程函数。线程的任务就是
去执行start_routine指向的这个函数。
arg: void* ,将作为线程函数的实参传入。
返回值:
成功返回0
失败返回-1,errno被设置。
(2) 线程退出
2.1 线程函数返回 (return)
2.2 在线程执行的任意时刻 调用 pthread_exit
#include <pthread.h>
void pthread_exit(void *retval);
retval:指针指向的空间,用来表示退出码。
2.3 线程被别人“取消”(其它线程调用 pthread_cancel)
新创建的线程,默认属性是可以被取消的。
函数
int pthread_cancel(pthread_t tid);
tid: 指定接收“取消请求”的线程的ID、
返回值:
成功返回0
失败返回非0
t1 : pthread_cancel(t2)
t1调用函数pthread_cancel结束 t2这个线程
t2是否结束得依赖t2这个线程的属性: -> 它是否可以被cancelled.
这个“可被取消属性”, pthread提供了一个函数接口,去修改它。
pthread_setcancelstate : 设置本线程自己的“取消属性”
#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
state: 要设置的“取消属性”的状态。
PTHREAD_CANCEL_ENABLE :该线程可以被别人取消
PTHREAD_CANCEL_DISABLE : 该线程不能够被别人取消
oldstate: 保存上一次“取消属性”的状态。
(3) 退出时,释放资源。
一个线程退出了,并不代表它的所有的资源都释放了。
一个线程的退出,它的资源是否全部被释放,取决于它另一个属性:
detach: 分离属性
ENABLE: 分离
该线程结束,它所有的资源就会自动释放
DISABLE: 非分离 <------- 默认属性
该线程结束,它的有部分资源不会自动释放
就可能需要调用 pthread_join这个函数才能完全释放。
pthread_detach: 设置自己的“分离属性”
函数:
#include <pthread.h>
int pthread_detach(pthread_t thread);
(4) 等待线程退出,并且释放“非分离属性”的线程的资源
#inc