多线程编程

线程模型

这里写图片描述

创建线程和结束线程

函数名返回值作用
pthread_create成功返回0,错误返回错误码创建线程
pthread_exit永远不会失败确保线程安全退出,其参数向线程回收者传递退出信息.(注意不可使用exit())
pthread_join成功返回0,错误返回回收线程,函数会阻塞至被回收线程结束。retval则会返回退出信息
pthread_cancel成功返回0,错误返回错误码取消线程,需要一个取消点,可以是系统调用或者是pthread_testcancel()调用
pthread_setcancelstate成功返回0,错误返回错误码取消状态
pthread_setcanceltype成功返回0,错误返回错误码取消类型

这里写图片描述

POSIX取消点

PTHREAD_CANCEL_ASYNCHRONOUS可以被这些取消点函数pthread_join pthread_testcancel pthread_cond_wait pthread_cond_timewait sem_wait sigwait取消。
根据POSIX标准,其他可能阻塞的系统调用,比如read,wait也可以成为取消点。为了安全,最好在可能会被取消的代码中调用pthread_testcancel函数以设置取消点。

线程属性

#include<bits/pthreadtypes/h>
#define __SIZEOF_PTHREAD_ATTR_T 36
typedef union {
    char __size[__SIZEOF_PTHREAD_ATTR_T];
    long int __align;
}pthread_attr_t;
#include<pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
//初始化线程属性对象
int pthread_attr_destory(pthread_attr_t *attr);
//销毁线程属性对象
int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);
//获得线程的堆栈起始地址
int pthread_attr_setstackaddr(const pthread_attr_t *attr, void *stackaddr);
//设置线程的堆栈起始地址
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
//获得线程的堆栈起大小
int pthread_attr_setstacksize(const pthread_attr_t *attr, size_t stacksize);
////设置线程的堆栈起大小
int  pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
int  pthread_attr_setstack(const pthread_attr_t *attr, void **stackaddr, size_t stacksize);
int pthread_attr_getguardsize(const pthread_attr_t* attr, size_t *guardsize);
//获取保护区大小
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
//设置保护区大小,如果guardsize大于0,则系统创建线程时会在其堆栈尾部额外分配
//guardsize字节控件,作为保护堆栈不被错误覆盖的区域。等于0,则不进行设置。
//如果使用pthread_attr_setsockaddr或pthread_attr_setsock函数手动设置线程堆栈
//则guardsize将被忽略。
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
//获取线程调度参数
int pthread_attr_setschedparam(pthread_attr_t *attr, const  struct sched_param *param);
//设置线程调度参数,其类型是sched_param类型的结构体,该结构体只有一个整型成员sched_priority表示优先级
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
//获取线程调度策略
int pthread_attr_setschedpolicy(const pthread_attr_t *attr, int policy);
//设置线程调度策略 SHCED_FIFO先进先出的调度 SCHED_RR采用轮转算法调度 SCHED_FIFO采用默认调度

int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
//获取是否继承调用线程的调度属性
int pthread_attr_setinheritsched(const pthread_attr_t *attr, int inherit);
//设置是否继承调用线程的调度属性,该属性有PTHREAD_INHERIT_SCHED和
//PTHREAD_EXPLICIT_SCHED,前者表示新线程沿用其创建者的线程调度参数,
//这种情况下再设新线程的调度参数将没有任何效果。后者表示调用者要明确的指定新线程的调度参数。
int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
//获得线程间竞争CPU的范围,既优先级的有效范围。
int pthread_attr_setscope(const pthread_attr_t *attr, int scope);
//设置线程间竞争CPU的范围,既优先级的有效范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值