Pthread线程库部分函数
线程库
同步线程
父线程必须等到子线程结束才能恢复执行,也被称为fork-join strategy
异步线程
创建好子线程后父线程就继续执行,父子线程是并发执行
Pthread
1 | int pthread_create(pthread_t *tidp, const pthread_attr_t *attr,( void *)(*start_rtn)( void *), void *arg); |
编译链接参数:-lpthread
第一个参数为指向线程 标识符的 指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
1 | pthread_t tid //无符号长整型,线程标识符 |
线程属性函数
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 分离状态)时有效,在当前位置创建取消点