多线程编程

一 .创建线程

#include<pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*strart_rtn)(void*), void *restrict arg);
tidp:tidp指向的内存填写为线程ID 
attr:用来设置线程属性
start_rtn:线程的执行函数
arg:执行函数start_rtn,传入参数arg

二.线程结束

线程退出 
void pthread_exit(void* rval_ptr);

取消线程
int pthread_cancel(pthread_t tid);
//只是提出取消线程的请求,不等待线程终止

获取线程的退出码
int pthread_join(pthread_t thread, void **rval_ptr);
线程有三种终止方式:
1.线程执行的函数return,     pthread_join获取的 rval_ptr指向的内存设置为return值
2.线程调用pthread_exit;    pthread_join获取的 rval_ptr指向的内存设置为pthread_exit的参数
3.线程被取消,               pthread_join获取的 rval_ptr指向的内存设置为PTHREAD_CANCELED

三 .线程属性

线程属性的初始化和销毁

初始化线程属性 
int pthread_attr_init(pthread_attr_t *attr);
销毁线程属性
int pthread_attr_destroy(pthread_attr_t *attr);

分离状态属性

分离状态属性有两个合法值:
PTHREAD_CTREATE_DETACHED 和 PTHREAD_CREATE_JOINABLE

joinable状态的线程,终止后,需要其它线程调用pthread_join后才释放资(如栈)源; detached状态的线程终止后,操作系统会自动回收线程的资源,可以在线程创建或者运行时设置线程状态;

获取 分离状态属性 
int pthread_attr_getdetachstate(const pthread_t *attr, int *detachstate);

设置分离状态属性
int pthread_attr_setdetachstate(pthread_t *attr, int detachstate)

分离线程
int pthread_detach(pthread_t tid);
//对已经分离的线程调用pthread_join,会产生EINVAL

线程的取消选项

线程的可取消状态可以是否PTHREAD_CANCEL_ENABLE 或者PTHREAD—CANCEL_DISABLE

设置可取消状态
int pthread_setcancelstate(int state, int *oldstate);

取消点,表示当前线程可以被取消的点;
包括一些系统调用,如accept,getmsg,msgsndread等;
也可以通过调用函数ptread_testcansel()设置取消点;
如果线程在PTHREAD—CANCEL_DISABLE状态时,pthread_cancel调用产生的取消请求处于未决状态,当取消状态变为PTHREAD_CANCEL_ENABLE后,在取消点上,会对未决的取消请求进行处理.

取消类型 
分为延迟取消和异步取消
延迟取消是在取消点上才能被取消,异步取消则可以在任意点被取消,如果是异步类型,取消点就没用了 
int pthread_setcanceltype(int type, int *oldtype);

四.互斥锁属性

属性初始化和销毁

//初始化
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
//销毁
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

互斥量的进程共享属性

属性值为 PTHREAD_PROCESS_PRIVATE 或 PTHREAD_PROCESS_SHARED

互斥量属性为PTHREAD_PROCESS_SHARED时,可以如果互斥量位于共享内存区,进程可以通过此互斥量进行同步;

获取进程共享属性
int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int* pshared);
设置进程共享属性
int pthread_mutexattr_setpshared(const pthread_mutexattr_t* attr, int pshared);

互斥量的类型

互斥量类型同一线程没解锁时再次加锁不占用时解锁已解锁时解锁
PTHREAD_MUTEX_NORMAL死锁未定义未定义
PTHREAD_MUTEX_ERRRORCHECK返回错误返回错误返回错误
PTHREAD_MUTEX_RECURESIVE允许返回错误返回错误
PTHREAD_MUTEX_DEFAULT未定义未定义未定义
PTHREAD_MUTEX_RECURESIVE允许同一个线程多次加锁,但是锁的释放次数要和加锁次数保持一致,否则锁不会释放

获取互斥里量类型
ing pthread_mutexattr_gettype(const pthread_mutexattr_t* attr, int* type);
设置互斥量类型
int pthread_mutexattr_settype(pthread_mutexattr_t* attr, int type);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值