Linux Pthread学习记录

Linux Pthread相关学习记录,自旋锁、读写锁、线程池有待完善文章目录线程基础线程调度竞争范围线程模型N:1用户线程模型1:1核心线程模型N:M混合线程模型线程创建错误检查线程属性初始化与销毁属性获取与设置分离属性获取和设置栈大小获取与设置栈移出保护区大小获取与设置线程竞争范围获取与设置调度策略获取与设置继承的调度策略获取与设置调度参数并发级别退出线程join线程/detach线程返回当...
摘要由CSDN通过智能技术生成

Linux Pthread相关学习记录,自旋锁、读写锁、线程池有待完善

线程基础

  • 线程操作包括线程创建、终结、同步(joins,blocking)、调度、数据管理以及进程交互
  • 一个线程不维护创建线程列表,不知道其创建线程
  • 在同一进程的线程共享:
    • 进程指令
    • 大部分数据
    • 文件描述符
    • 信号及信号处理函数
    • 当前工作目录
    • 用户和组id
  • 不同线程拥有唯一的:
    • 线程id
    • 一系列寄存器,堆栈指针
    • 维护局部变量及返回地址的栈
    • 信号掩码(signal mask)
    • 优先级
    • 全局返回值:errno
  • pthread函数成功返回值为0

线程调度竞争范围

  • 操作系统提供了各种模型,用来调度应用程序创建的线程。这些模型之间的主要不同是:在竞争系统资源(特别是CPU时间)时,线程调度竞争范围不一样
  • 进程竞争范围:各个线程在同一进程竞争“被调度的CPU时间”(但不直接和其他进程中的线程竞争)
  • 系统竞争范围:线程直接和“系统范围”内的其他线程竞争

线程模型

N:1用户线程模型

  • 线程实现建立在进程控制机制至上,由用户空间的程序库来管理。OS内核完全不知道线程信息。这些线程称为用户空间线程。
  • 这些线程都工作在“进程竞争范围
  • 在N:1线程模型中,内核不干涉线程的任何生命活动,也不干涉同一进程中的线程环境切换
  • 在N:1线程模型中,一个进程中的多个线程只能调度到一个CPU,这种约束限制了可用的并行总量
  • 第二个缺点是如果某个线程执行了一个“阻塞式”操作(如read),那么进程中的所有线程都会被阻塞,直到那个操作结束。为此,一些线程的实现是为这些阻塞式函数提供包装器,用非阻塞版本替换这些系统吊桶,用以消除这种限制。

1:1核心线程模型

  • 1:1核心线程模型中,应用程序创建的每一个线程都由一个核心线程直接管理
  • OS内核将每一个核心线程都调到系统CPU上,因此,所有线程都工作在“系统竞争范围”
  • 这种线程的创建与调度由内核完成,因为这种线程的系统开销比较大(比进程开销小)

N:M混合线程模型

  • N:M混合线程模型提供了两级控制,将用户线程映射为系统的可调度体以实现并行,这个可调度体称为轻量级进程(LWP:light weight process),LWP再一一映射到核心线程。

线程创建

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);

返回值
成功:返回0
失败:返回错误码,strerror(ret)返回错误描述
参数 说明
thread 线程id
attr 线程属性
start_routine 函数指 针
arg 函数的参数,可以只用指向结构体的指针传入一系列参数

错误检查

  • 传统一些函数,成功返回0,失败返回-1,并且设置errno指示错误
  • pthreads函数出错时不会设置全局变量errno(大部分POSIX函数会这么做)。而是将错误代码通过返回值返回
  • pthreads同样也提供了线程内的errno变量,以支持其他使用errno的代码。对于pthreads函数的错误,建议通过返回值判定,因为读取返回值要比读取线程内的errno变量开销小

线程属性

初始化与销毁属性

int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destory(pthread_attr_t *attr);

获取与设置分离属性

#include <pthread.h>

int pthread_attr_getdetachstate(const pthread_attr_t *attr,
 int *detachstate);

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

detachstate:PTHREAD_CREATE_DETACHED/PTHREAD_CREATE_JOINABLE(默认)

获取和设置栈大小

#include <pthread.h>

int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,
 size_t *restrict stacksize);

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

获取与设置栈移出保护区大小

#include <pthread.h>
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);

int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize);

获取与设置线程竞争范围

#include <pthread.h>

int pthread_attr_getscope(const pthread_attr_t *restrict attr,
 int *restrict contentionscope);

int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);

contentionscope值 说明
PTHREAD_SCOPE_SYSTEM indicating a scheduling contention scope that is system-wide
PTHREAD_SCOPE_PROCESS which indicates a process scheduling contention scope.

获取与设置调度策略

#include <pthread.h>

int pthread_attr_getschedpolicy(const pthread_attr_t *restrict attr,
 int *restrict policy);

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);


policy 说明
SCHED_FIFO 先进先出
SCHED_RR 抢占
SCHED_OTHER 默认

获取与设置继承的调度策略

#include <pthread.h>

int pthread_attr_getinheritsched(const pthread_attr_t *restrict attr,
 int *restrict inheritsched);

int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);


inheritsched 说明
PTHREAD_INHERIT_SCHED Indicates that the newly created thread should inherit all it’s scheduling related attributes from it’s creating thread. It ignores the values of the relevant attributes within the attr argument.(默认值)
PTHREAD_EXPLICIT_SCHED Indicates that the newly created thread should set it’s scheduling related attributes based on attr argument.

获取与设置调度参数

#include <pthread.h>

int pthread_attr_getschedparam(const pthread_attr_t *restrict attr,
 struct sched_param *restrict param);

int pthread_attr_setschedparam(pthread_attr_t *restrict attr,
 const struct sched_param *restrict param);
 
 
struct sched_param { int sched_priority;  char __opaque[__SCHED_PARAM_SIZE__]; };
 
sched_priority:默认值为0
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值