linux学习笔记之线程

一、基础知识

1:基础知识。

  1,线程需要的信息有:线程ID,寄存器,栈,调度优先级和策略,信号屏蔽字,errno变量和线程私有数据。

  2,进程的所有信息对所有线程都是共享的。

  3,是否支持有多线程有以下两种方式测试:

    1)编译时确定:#ifdef _POSIX_THREADS

    2)运行时确定:sysconf函数调用 _SC_THREADS 常用。

  4,线程ID。

    1)一个进程中,线程ID具有唯一性。线程ID依赖与进程后,才有意义。

    2)线程ID表示类型:pthread_t类型

  5,变量增量操作的步骤:

    1)变量值从 内存单元 读入 寄存器。

    2)寄存器中对变量进行修改。

    3)将变量值 写回 内存单元

    4)所以,多个线程试图同时修改同一变量时,需要同步。

2:线程创建和终止。

  1,线程创建。

    1)并不能确定哪个线程先运行(和子进程创建类似)。

    2)创建函数create失败后,通常会返回错误码。

  7,线程终止。

    1)任意线程调用 exit, _Exit, _exit函数都会使进程终止。(所以不可以使用此方式终止单个线程)

    2)从启动例程返回。返回值时线程退出码。

    3)可以被同进程中的其他线程取消。

    4)线程调用pthread_exit函数。

3:进程和线程功能/函数对应表

进程原语 线程原语 描述

fork

pthread_create 创建新的控制流
exit pthread_exit 从先有控制流中退出
waitpid pthread_join 从控制流中得到退出状态
atexit pthread_cancel_push 注册在退出控制流时的调用的函数
getpid pthread_self 获取控制流的ID
abort pthread_cancel 请求控制流的非正常退出。

二、相关函数。

1:线程操作函数。

1 比较线程ID大小。
  int pthread_equal( pthread_t tid1, pthread_t tid2 )
2 获取自身线程ID。
  pthread_t pthread_self( void );
3 创建线程。
  int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
  1 参数arg用于定制各种不同的线程属性
4 线程终止。
  void pthread_exit( void *rval_ptr );
5 获得线程退出状态。
  int pthread_join( pthread_t thread, void **rval_ptr );
  1 参数rval_ptr包含返回码。
6 取消其他线程(同进程中使用)
  int pthread_cancel( pthread_t tid );
  1 仅仅提出请求。并不强制终止。
7 线程清理处理程序(类似进程的atexit)。
  void pthread_cleanup_push( void (*rtn)(void *), void *arg);
  void pthread_cleanup_pop( int execute );
  1 参数execute=0时,清理函数将不被调用。
  2 每次调用pop函数时,都出删除上一个push的清理程序。
  3 这些函数被实现为宏。需要注意{}等匹配。
  4 清理程序的注册和执行顺序相反。
8 分离线程。
  int pthread_detach( pthread_t tid );9 上述函数中。部分无类型指针,可以传递的值有很多,甚至可以时一个结构体。

2,线程属性 相关函数。

1 线程属性 初始化 和 类析构函数
  int pthread_attr_init( pthread_attr_t *attr );
  int pthread_attr_destroy( pthread_attr_t *attr );
2 获取/设置 分离状态。
  int pthread_attr_getdetachstats( const pthread_attr_t *restrict attr, int *detachstate );
  int pthread_attr_setdetachstats( pthread_attr_t *attr, int *detachstate );
  1 参数detachstate只有两个值:PTHREAD_CREATE_ DETACHED/JOINABLE.
3 获取/设置 线程栈属性 stackaddr。
  int pthread_attr_getstack( const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize );
  int pthread_attr_setstack( pthread_attr_t *attr, void *stackaddr, size_t stacksize );
  1 stackaddr线程属性定义为栈的最低内存地址。是起始位置,还是结尾位置取决于栈的发展方向。通常是结尾(栈由高向低)
4 获取/设置 栈大小属性 stacksize。
  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 );
5 获取/设置 线程栈末尾缓冲区大小 guardsize。
  int pthread_attr_getguardsize( const pthread_attr_t *restrict attr, size_t *restrict guardsize );
  int pthread_attr_setguardsize( pthread_attr_t *attr, size_t guardsize );

三、

时间: 2024-10-28 04:57:54

linux学习笔记之线程的相关文章

linux学习笔记之线程同步机制

一.基础知识. 1:线程同步机制:互斥量,读写锁,条件变量,自旋锁,屏障. 1,互斥量:每个进程访问被互斥量保护的资源时,都需要先对互斥量进行判断. 1)互斥量重要属性:进程共享属性,健壮属性,类型属性. 2)部分系统 不支持 进程共享属性 3)对互斥量重复加锁会导致死锁. 2,读写锁. 1)读写锁有3种状态:读模式加锁,写模式加锁,未加锁. 1-写加锁模式:任何加锁都会被阻塞. 2-读加锁模式:读模式加锁的任何线程都可以得到访问权,同时添加一个读模式锁.但,写模式加锁会被阻塞. 3-在读模式下

Linux System Programming 学习笔记(七) 线程

1. Threading is the creation and management of multiple units of execution within a single process 二进制文件是驻留在存储介质上,已被编译成操作系统可以使用,准备执行但没有正运行的休眠程序 进程是操作系统对 正在执行中的二进制文件的抽象:已加载的二进制.虚拟内存.内核资源 线程是进程内的执行单元 processes are running binaries, threads are the smal

操作系统学习笔记----进程/线程模型----Coursera课程笔记

操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进程创建.撤销.阻塞.唤醒.... 0.2 线程模型 为什么引入线程 线程的组成 线程机制的实现 用户级线程.核心级线程.混合方式 1. 进程的基本概念 1.1 多道程序设计 允许多个程序同时进入内存运行,目的是为了提高CPU系统效率 1.2 并发环境与并发程序 并发环境: 一段时间间隔内,单处理器上

linux学习笔记(一)-文件目录相关的命令&&文件通配符

一.几个命令概述 1.查看目录以及目录底下的文件:ls(-a显示隐藏文件:-d显示目录本身:-l显示详细内容:-R递归显示,即把子目录的文件也显示出来:-h以更加被人类理解的格式显示,比如显示文件大小的时候用M为单位显示:-i显示文件索引ID) 2.查看文件内容:cat,head,tail,less,more,tac cat:将文件连接起来,输出在屏幕上,可接多个文件(-E:显示隐藏的换行符:-n:显示出行号) head:默认查看文件的前10行(-n#:查看文件的前#行.空白行也是一行) tai

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

Linux学习笔记——例说makefile 增加系统共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

Linux学习笔记——如何使用echo指令向文件写入内容

0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容的基本方法是使用IO重定向指令--">",默认情况下echo输出到标准输出中,使用>指令可重定向输出到文件中. 1.echo指令基本用法 [1]Linux官方用户手册--echo指令 [2]输入指令获得帮助 sudo echo --help 返回内容如下 用法:echo [短选项]... [字

linux学习笔记--vim程序编辑器

1,在linux系统中使用文本编辑器来编辑自己的linux参数配置文件是一件很重要的事情,因此系统管理员至少应该要熟悉一种文本编辑器. 2,不同的linux distribution各有不同的附加软件,linux命令行界面下的文本编辑器有Emacs,pico,nano,joe与vim 3,学习vim的重要性 (1)所有的UNIX Like系统都内置vi文本编辑器,其他的文本编辑器不一定存在 (2)很多软件的编辑接口都会主动调用vi (3)vim具有程序编辑的能力,可以主动以字体颜色辨别语法的正确

linux学习笔记-type命令

语法: type [-tpa] name 参数: type:    不加任何参数时,type会显示出name是外部命令还是内部bash内置命令 -t:      当加入-t参数时,type会将name以下面这些字眼显示出它的意义 file:表示为外部命令 alias:表示该命令为命令别名所设置的名称 builtin:表示该命令为bash内置的命令功能 -p:     如果后面接的name为外部命令时,才显示完整文件名 -a:     会有path变量定义的路径中,将所有含有name的命令都列出来