线程可以与进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。线程相对于进程而言,执行开销小,但不利于资源管理和保护。
linux线程在核内是以轻量级进程的形式存在的。
一、线程的创建
1、pthread_create():创建线程
#include <pthread.h>
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
thread:线程标识符,attr:线程属性,start_routine:线程运行函数地址,art:函数运行参数。
2、pthread_join():用于等待一个线程的结束。
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
thread:被等待的线程,value_ptr:用于存储所等待线程的返回值。
3、pthread_exit():终止线程。
#include <pthread.h>
void pthread_exit(void *value_ptr);
二、取消线程
一般情况下,线程在其主函数退出时会自动终止,但同时也可以因为接收到另一个线程发来的终止(Cancel)请求而强制终止。线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略,或者立即终止,或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到cancel信号的默认处理是继续运行至取消点。会引起阻塞的系统调用都是取消点,可以在需要作为取消点的调用前后调用pthread_testcancel()。如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止,因此,在这样的循环体的必然路径上应该加入pthread_testcancel()调用。
int pthread_cancel(pthread_t thread);
发送终止信号给thread线程。
int pthread_setcanceltype(int type ,int *oldtype);
设置本线程取消动作的执行时机,type有两个值,PTHREAD_CANCEL_EFFERED 和 PTHREAD_CANCEL_ASYCHRONUS 分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作。
int pthread_setcancelstate(int state ,int *oldstate);
设置本线程对Cancel信号的反应,state有两种值,PTHREAD_CANCEL_ENABLE(默认)和PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为cancel状态和忽略cancel信号。oldstate保存原来的state状态。
linux线程在核内是以轻量级进程的形式存在的。
一、线程的创建
1、pthread_create():创建线程
#include <pthread.h>
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
thread:线程标识符,attr:线程属性,start_routine:线程运行函数地址,art:函数运行参数。
2、pthread_join():用于等待一个线程的结束。
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
thread:被等待的线程,value_ptr:用于存储所等待线程的返回值。
3、pthread_exit():终止线程。
#include <pthread.h>
void pthread_exit(void *value_ptr);
二、取消线程
一般情况下,线程在其主函数退出时会自动终止,但同时也可以因为接收到另一个线程发来的终止(Cancel)请求而强制终止。线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略,或者立即终止,或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到cancel信号的默认处理是继续运行至取消点。会引起阻塞的系统调用都是取消点,可以在需要作为取消点的调用前后调用pthread_testcancel()。如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止,因此,在这样的循环体的必然路径上应该加入pthread_testcancel()调用。
int pthread_cancel(pthread_t thread);
发送终止信号给thread线程。
int pthread_setcanceltype(int type ,int *oldtype);
设置本线程取消动作的执行时机,type有两个值,PTHREAD_CANCEL_EFFERED 和 PTHREAD_CANCEL_ASYCHRONUS 分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作。
int pthread_setcancelstate(int state ,int *oldstate);
设置本线程对Cancel信号的反应,state有两种值,PTHREAD_CANCEL_ENABLE(默认)和PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为cancel状态和忽略cancel信号。oldstate保存原来的state状态。