线程
线程是计算机中独立运行的最小单位,运行时占用很少的系统资源,由于每个线程占用的cpu时间是由系统分配的,因此可以把线程看成是系统分配cpu 时间的基本单位,在于用户看来,多个线程是交替执行的,系统不停的在各个线程之间切换,每个线程只有在系统分配给他的时间片内才能取得cpu的控制权,执行线程中的代码

线程的优点:节约,节约资源,节省时间,提高应用程序的响应速度,可以提高多处理器的效率,可以改善程序的结构

线程也有很多私有数据:线程号,寄存器,堆栈,信号掩码,优先级,线程私有的存储空间

一.创建线程 pthread_create函数
#include<pthread.h> 
int pthread_create ( pthread_t  *thread,const  pthread_attr_t   *attr,  (void*)(*start_routine)(void*)  ,void *arg);

第一个参数为指向线程标识符的指针,当线程创建成功的时候,用来返回创建线程的id 。
第二个参数用来设置线程属性,NULL表示默认的属性。
第三个参数是线程运行函数的起始地址,该参数是一个函数指针,指向线程创建后要调用的函数,这个被线程调用的函数也称为线程函数。
最后一个参数指向传递给线程函数的参数。

创建成功时,函数返回0,由thread指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_routine函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_routine函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
linux下用C语言开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。
由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

二.线程属性
创建函数pthread_create有一个参数的类型为pthread_attr_t,该结构体定义如下
typedef struct
              {
                       int                                  detachstate;         线程的分离状态
                       int                                  schedpolicy;      线程调度策略
                       struct sched_param           schedparam;     线程的调度参数
                       int                                  inheritsched;        线程的继承性
                       int                             scope;               线程的作用域
                       size_t                            guardsize;       线程栈末尾的警戒缓冲区大小
                       int                                  stackaddr_set;    栈堆的地址集
                       void *                             stackaddr;          线程栈的位置
                       size_t                             stacksize;           线程栈的大小
                }pthread_attr_t;

 .detachstate,表示新线程是否与进程中其他线程脱离同步, 如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
 .schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
 .schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
 .inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
 .scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。

转载于:https://www.cnblogs.com/kaylee-lr/p/4685905.html

linux c 笔记 线程控制(一)相关推荐

  1. Linux学习06——线程控制与同步互斥

    概述 学习目标: 理解线程概念和并发特征,分辨线程与进程的区别与联系 掌握多线程应用编程技术,掌握线程间数据传递基本方法 掌握共享变量识别方法,理解多线程访问共享变量可能带来的问题 理解临界资源.临界 ...

  2. Linux学习笔记-线程的自然终止

    线程的自然终止 线程主函数退出时,该线程自然终止.例如,下面的线程运行10秒后终止 ... void* Thread_Main(void* context) {for(int i=0; i<10 ...

  3. Linux系统笔记:shell命令、文件系统、Vi编辑器、文件IO、mmap()、bmp图片格式、线程

    文章目录 一.shell命令集 二.ubuntu文件系统 三.vi编辑器 四.文件IO 五.Linux中C库mmap()函数详解 六.bmp图片格式详解 七.C语言笔记 (一)标准IO函数 time( ...

  4. Linux系统编程之进程与线程控制原语对比

    Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...

  5. Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制

    线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...

  6. linux多线程学习(五)——信号量线程控制

    在上一篇文章中,讲述了线程中互斥锁的使用,达到对共享资源互斥使用.除了使用互斥锁,信号量,也就是操作系统中所提到的PV原语,能达到互斥和同步的效果,这就是今天我们所要讲述的信号量线程控制. PV原语是 ...

  7. 菜鸟学Linux 第031篇笔记 script,控制,while,function

    菜鸟学Linux 第031篇笔记 script,控制,while,function 一.脚本需求: 说明:此脚本能于同一个repo文件中创建之个yum源的指向: 1.接受一个文件名作为参数,此文件存放 ...

  8. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

  9. Linux多线程---线程概念和线程控制

    线程概念 什么是线程? CPU视角: 与进程的关系: Linux下线程概念 那么CPU能分辨task_struct是进程和线程吗? 理解页表 为何以多级页表实现? 多级页表是如何实现的? 多级页表的优 ...

  10. 【Linux】线程概念与线程控制

    认识线程 线程是一个执行流(运行代码,处理数据) ​ 1.操作系统使用pcb来描述一个程序的运行-------pcb就是进程 ​ 2.linux下通过pcb模拟实现线程,因此linux下的线程是一个轻 ...

最新文章

  1. 在SQL Server 2005 Express 中添加报表服务后 (Business Intelligence Development Studio) vs2005 加载程序集问题解决办法...
  2. QTableView中修改某个单元格或者行或者列内容颜色
  3. 安装 Windows 自动化 API 3.0 后,Visual Studio 2010 的运行速度更快
  4. 推荐几个前端大佬,真的厉害!
  5. 通信系统的同步技术归纳
  6. CAN笔记(16) CANOpen简介
  7. I2C总线学习—查缺补漏—S3C2440的I2C控制器
  8. LeetCode-210 Course Schedule II
  9. MvcPager使用的Demo(同步分页)
  10. windows自带的压缩/解压缩(zip/unzip)功能-Powershell 的应用之一
  11. 超级超级实用的整个网页截图技巧
  12. 有关微信小程序接入腾讯云IM即时通讯内容
  13. 2020年鼠年春节贺词祝福大全
  14. 【算法】O(n2)时间复杂度和O(nlogn)排序算法的简要分析
  15. 海量资源!开发人员成功转行数据科学必备清单
  16. 0x5085170C (ucrtbased.dll)处(位于 Project1.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000001A 时发生访问冲突。
  17. 怎么用计算机制作海报,电脑word怎么做海报_用word做的海报步骤
  18. 软件体系结构层次风格
  19. 微信公众号助手android,微信团队发布微信公众号订阅号助手App
  20. 面对一切,我们要坦然

热门文章

  1. C#对文件的操作(创建、获取文件数量、删除)(读、写文件)
  2. go语言php编译,golang怎么编译
  3. Cannot add task ‘wrapper‘ as a task with that name already exists.
  4. makeinfo:未找到命令
  5. 使用PrinterJob进行分页打印
  6. 2020-9测试通过:eclipse安装svn插件
  7. LINUX SHELL中echo如何处理特殊字符
  8. 统计表明,睡懒觉迟到早退的人特别有创造力,这是真的吗?
  9. 面试怪事:网上抄答案的程序员
  10. 光干涉波谷,有可能低于绝对零度