linux c 笔记 线程控制(一)
线程
线程是计算机中独立运行的最小单位,运行时占用很少的系统资源,由于每个线程占用的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 笔记 线程控制(一)相关推荐
- Linux学习06——线程控制与同步互斥
概述 学习目标: 理解线程概念和并发特征,分辨线程与进程的区别与联系 掌握多线程应用编程技术,掌握线程间数据传递基本方法 掌握共享变量识别方法,理解多线程访问共享变量可能带来的问题 理解临界资源.临界 ...
- Linux学习笔记-线程的自然终止
线程的自然终止 线程主函数退出时,该线程自然终止.例如,下面的线程运行10秒后终止 ... void* Thread_Main(void* context) {for(int i=0; i<10 ...
- Linux系统笔记:shell命令、文件系统、Vi编辑器、文件IO、mmap()、bmp图片格式、线程
文章目录 一.shell命令集 二.ubuntu文件系统 三.vi编辑器 四.文件IO 五.Linux中C库mmap()函数详解 六.bmp图片格式详解 七.C语言笔记 (一)标准IO函数 time( ...
- Linux系统编程之进程与线程控制原语对比
Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...
- Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制
线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...
- linux多线程学习(五)——信号量线程控制
在上一篇文章中,讲述了线程中互斥锁的使用,达到对共享资源互斥使用.除了使用互斥锁,信号量,也就是操作系统中所提到的PV原语,能达到互斥和同步的效果,这就是今天我们所要讲述的信号量线程控制. PV原语是 ...
- 菜鸟学Linux 第031篇笔记 script,控制,while,function
菜鸟学Linux 第031篇笔记 script,控制,while,function 一.脚本需求: 说明:此脚本能于同一个repo文件中创建之个yum源的指向: 1.接受一个文件名作为参数,此文件存放 ...
- [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)
文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...
- Linux多线程---线程概念和线程控制
线程概念 什么是线程? CPU视角: 与进程的关系: Linux下线程概念 那么CPU能分辨task_struct是进程和线程吗? 理解页表 为何以多级页表实现? 多级页表是如何实现的? 多级页表的优 ...
- 【Linux】线程概念与线程控制
认识线程 线程是一个执行流(运行代码,处理数据) 1.操作系统使用pcb来描述一个程序的运行-------pcb就是进程 2.linux下通过pcb模拟实现线程,因此linux下的线程是一个轻 ...
最新文章
- 在SQL Server 2005 Express 中添加报表服务后 (Business Intelligence Development Studio) vs2005 加载程序集问题解决办法...
- QTableView中修改某个单元格或者行或者列内容颜色
- 安装 Windows 自动化 API 3.0 后,Visual Studio 2010 的运行速度更快
- 推荐几个前端大佬,真的厉害!
- 通信系统的同步技术归纳
- CAN笔记(16) CANOpen简介
- I2C总线学习—查缺补漏—S3C2440的I2C控制器
- LeetCode-210 Course Schedule II
- MvcPager使用的Demo(同步分页)
- windows自带的压缩/解压缩(zip/unzip)功能-Powershell 的应用之一
- 超级超级实用的整个网页截图技巧
- 有关微信小程序接入腾讯云IM即时通讯内容
- 2020年鼠年春节贺词祝福大全
- 【算法】O(n2)时间复杂度和O(nlogn)排序算法的简要分析
- 海量资源!开发人员成功转行数据科学必备清单
- 0x5085170C (ucrtbased.dll)处(位于 Project1.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000001A 时发生访问冲突。
- 怎么用计算机制作海报,电脑word怎么做海报_用word做的海报步骤
- 软件体系结构层次风格
- 微信公众号助手android,微信团队发布微信公众号订阅号助手App
- 面对一切,我们要坦然
热门文章
- C#对文件的操作(创建、获取文件数量、删除)(读、写文件)
- go语言php编译,golang怎么编译
- Cannot add task ‘wrapper‘ as a task with that name already exists.
- makeinfo:未找到命令
- 使用PrinterJob进行分页打印
- 2020-9测试通过:eclipse安装svn插件
- LINUX SHELL中echo如何处理特殊字符
- 统计表明,睡懒觉迟到早退的人特别有创造力,这是真的吗?
- 面试怪事:网上抄答案的程序员
- 光干涉波谷,有可能低于绝对零度