线程库

同步线程

父线程必须等到子线程结束才能恢复执行,也被称为fork-join strategy

异步线程

创建好子线程后父线程就继续执行,父子线程是并发执行

Pthread

1
int  pthread_create(pthread_t *tidp, const  pthread_attr_t *attr,( void *)(*start_rtn)( void *), void  *arg);

编译链接参数:-lpthread

第一个参数为指向线程 标识符的 指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pthread_t tid  //无符号长整型,线程标识符
pthread_attr_t attr; //线程属性的集合,是一个结构体,详细定义如下:
typedef struct
{
int detachstate; //线程的分离状态
int schedpolicy; //线程调度策略
structsched_param schedparam; //线程的调度参数
int inheritsched; //线程的继承性
int scope; //线程的作用域
size_t guardsize; //线程栈末尾的警戒缓冲区大小
int stackaddr_set; //线程栈的设置
void* stackaddr; //线程栈的位置
size_t stacksize; // 线程栈的大小
}pthread_attr_t;

线程属性函数

1
int pthread_attr_init(pthread_attr_t *attr);

初始化线程属性对象,为其赋默认值,成功返回0,失败返回非零

1
int pthread_attr_destroy(pthread_attr_t *attr);

销毁线程对象,返回值同上

1
int pthread_join(pthread_t tid, void **retval);

以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
参数 :thread: 线程标识符,即线程ID,标识唯一线程。

​ retval: 用户定义的指针,用来存储被等待线程的返回值,一般写为NULL即可。
返回值 : 0代表成功。 失败,返回的则是错误号。

一个线程不能被多个线程等待

1
void pthread_exit( void * value_ptr );

终止线程,参数:若pthread_join里为NULL,这里填0,这是因为,pthread_exit的参数会被传入join中作为第二个参数

线程分离状态

线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状态,则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。
可以使用pthread_attr_setdetachstate函数把线程属性detachstate设置为下面的两个合法值之一:设置为PTHREAD_CREATE_DETACHED,以分离状态启动线程;或者设置为PTHREAD_CREATE_JOINABLE,正常启动线程。可以使用pthread_attr_getdetachstate函数获取当前的datachstate线程属性。

多线程问题

fork()和exec()

如果程序中一个线程调用fork,如果之后立即调用exec,不会复制所有的线程,反之子进程会复制所有的线程

thread cancellation

异步取消:一个线程立即终止目标线程

延迟取消:目标线程不断检查她是否应该终止。

取消点(cancellation point):线程检查是否被取消并按照请求进行动作的一个位置

pthread_cancel调用并不等于线程终止,它只提出请求。线程在取消请求发出会继续运行,直到到达某个取消点

相关函数

1
int pthread_cancel(pthread_t tid)

发送终止信号,运行至取消点时会结束线程

1
void pthread_testcancel(void);

线程取消功能处于启用状态且类型设置为延迟模式(maybe 分离状态)时有效,在当前位置创建取消点