===========================进程和线程的区别==============================
线程和进程在使用上各有优缺点:
线程执行开销小,但不利于资源的管理和保护,而进程正相反。
每个进程都拥有自己的数据段、代码段和堆栈段,这就造成进程在进行创建、切换、撤销操作时,需要较大的系统开销。
为了减少系统开销,从进程中演化出了线程。为了让进程完成一定的工作,进程必须至少包含一个线程。
线程存在于进程中,共享进程的资源
!!!!编译时一定要在编译命令后面加上-pthread!!!!
====================================================================
pthread_create函数
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数 thread:线程ID号
attr :线程属性结构体地址,通常设置为 NULL
start_routine :函数指针,线程函数的入口地址
arg :传给线程函数的参数
返回 成功 --->0
失败 --->错误码
pthread_t pthread_self(void);
返回值 调用线程的线程 ID
int pthread_equal(pthread_t t1, pthread_t t2);
返回值 相等 --->非0
不等 --->0
功能
判断线程号 t1 和 t2 是否相等,为了方便移植,尽量使用函数来比较线程 ID
int pthread_join(pthread_t thread, void **retval);
参数 retval: 用来存储线程退出状态的指针的地址
返回值 成功 --->0
失败 --->错误码
功能
等待线程结束(此函数会阻塞),并回收线程资源,类似进程的 wait() 函数
如果线程已经结束,那么该函数会立即返回
一个线程仅允许一个线程使用pthread_join
一个线程不能被多个线程等待。否则第一个收到信号的线程成功返回。
其余调用pthread_join的线程返回错误码
注意
创建一个线程后应回收其资源,但使用 pthread_join() 函数会使调用者阻塞
Linux 还提供了非阻塞函数 pthread_detach() 来回收线程的资源
int pthread_detach(pthread_t thread);
返回值 成功 --->0
失败 --->非0,错误码
功能
线程分离的目的是将线程资源的回收工作交由系统自动来完成
注意
调用 pthread_detach() 后再调用 pthread_join() , pthread_join() 会立马返回,调用失败
void pthread_exit(void *retval);
参数 :retval --->存储线程退出状态的指针
功能:
退出调用线程,一个进程中的多个线程是共享该进程的数据段
因此,通常线程退出后所占用的资源并不会释放
int pthread_cancel(pthread_t thread);
返回值 成功 --->0
失败 --->非0
功能 给指定线程发送一个取消请求
一般情况下,线程在其主体函数退出的时候会自动终止,
但同时也可以因为接收到另一个线程发来的终止(取消)请求而强制终止。