1、线程: 由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大, 为了提高系统的性能,许多操作系统规范里引入了轻量级进程的概念,也被称为线程,在同一个进程中创建的线程共享该进程的地址空间,并且和进程一样都参与内核同一的调度。
2、进程和线程:
1)、线程是参与内核调度最小基本单位,进程是拥有资源的最小基本单位
2)、进程间相互独立,而同一个进程内的线程间共享进程内所有的资源
3)、多线程间通信简单,但是需要对临界资源进行互斥与同步操作,多进程间通信较难
4)、多线程安全性差,因为其中一个线程崩溃可能会对其他线程造成影响,多进程间相互独立,安全性高。
线程相关函数是由第三方库支持,所以编译时需要加上 -lpthread选项,man有关pthread函数之前要安装man手册包。
3、size +程序名,可以查看程序文件的段分布
4、ulimit -a 用来显示当前的各种用户进程限制
5、虽然在一个进程创建的线程共享该进程的地址空间,但是使用的栈却不是相同的,每创建一个线程,都会为其分配8M大小的栈。所以创建进程的个数是有限的。4G内存,只有0-3G可以用,那么可以创建382左右个线程.。
6、 主线程和子线程被操作系统调度是随机的,主要是看操作系统心情。
7、 当主线程退出时,整个进程里面的所有子进程都会随之退出
8、 如果有线程调用exit或_exec函数,那么整个进程都会退出
9、 pthread_exit( )调用这个函数的线程会退出,但是并不会释放线程分配的资源
10、 prhread_join( )这个函数在线程退出后,释放线程资源。这个函数会一直阻塞直到等到相应的线程退出为止。
11、创建一个进程pthread_create(),这个函数的第二个参数是设置线程属性的,设置为NULL为使用默认值。最后一个参数是其第三个回调函数的参数,如果不传参数,写NULL。
12、如果想设置线程属性,那就可以给pthread_create( )传第二个参数
例如:因为现在栈的大小为8K,那么我们申请一个9K的数据a[9*1028*1028],编译运行之后,会有段错误,我们想修改栈的大小,由8K修改成10K
(1)pthread_attr_t attr;
(2)pthread_attr_init(&attr)初始化属性对象
(3)pthread_attr_setstacksize(&attr,10*1024*1024)
修改完之后就不会出现段错误了。
13、pthread_detach( )函数用来设置线程游离态。游离线程运行结束后,不需要其他线程来回收它未释放的资源,它的资源会自动被回收。
使用示例:pthread_detach(pthread_self())。 pthread_self()这个函数是用来获取当前进程的tid的。
14、pthread_cancel( )这个函数是用来发送一个取消请求给一个线程的。接受到取消请求的线程默认的处理方式是响应,也就是退出运行。
15、pthread_setcancelstate(int state, int *oldstate)设置线程收到取消请求后是否响应。
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);响应
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);不响应、忽略
16、pthread_setcanceltype(int type, int *oldtype)设置收到取消请求后,怎么响应
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);遇到断点函数时,退出运行
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);直接退出
17、互斥是对临界资源提出的概念,同步是对协同完成某一件事提出的概念
18、编译器优化-O(-O1、-O2、-O3,随着后面的数字增大,优化程度增强)
关键字volatile,防止编译器优化。
19、互斥机制:

引入互斥(mutual exclusion)锁的目的是用来保证共享数据操作的完整性。
互斥锁主要用来保护临界资源
每个临界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源
线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止

互斥锁默认只能在线程间使用。通过修改int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex‐attr_t *mutexattr);的第二个参数的属性,使其也可以在进程间使用。使用默认设置就传空。

加锁(若不成功阻塞):int pthread_mutex_lock(pthread_mutex_t *mutex);
加锁(所不成功返回):int pthread_mutex_trylock(pthread_mutex_t *mutex);
解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);
删除互斥锁:int pthread_mutex_destroy(pthread_mutex_t *mutex);
静态初始化的互斥锁:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
对于静态初始化的互斥锁,不需要调用 pthread_mutex_init() 函数。

20、拥有锁,也就是拥有解锁的权限,却等待着别人开锁,这就是死锁
21、一个线程解锁后,可以再次竞争锁,并且获得锁的概率是随机的,可能一直得到锁释放锁,也可能一直得不到锁,也可能在得到锁得不到锁交替运行。
22、条件变量,结合互斥锁一起使用,实现同步机制
pthread_cond_t cond
pthread_cond_init(&cond,NULL);
pthread_cond_wait(&cond);
pthread_cond_broadcast();广播,唤醒所有wait线程
pthread_cond_signal();只唤醒一个进程,但是在多处理器平台上,也可能唤醒多个wait进程,所以不是很稳定。
注意:pthread_cond_wait会先解除之前的pthread_mutex_lock锁定的mtx,然后阻塞在等待队列里休眠,直到再次被唤醒(大多数情况下是等待的条件成立而被唤醒,唤醒后,该进程会先加锁相当于pthread_mutex_lock(&mtx);了一下,然后才会再读取资源。
静态创建pthread_cond_t cond=PTHREAD_COND_INITIALIZER(常量)
动态创建int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)

23、 同步机制用信号量来实现:

信号量代表某一类资源,其值表示系统中该资源的数量
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化一个信号量
参数:sem:信号量
pshared:0表示线程间,1表示进程间
value:初始化信号量的值
返回值:成功返回0,失败返回-1
int sem_wait(sem_t *sem)
功能:P操作,申请资源
参数:需要申请的信号量
返回值:成功返回0,失败返回-1
int sem_post(sem_t *sem)
功能:V操作,释放资源
参数:释放的信号量
返回值:成功返回0,失败返回-1

Linux线程基本知识相关推荐

  1. Linux进程管理:进程和线程基础知识

    <Linux进程管理:进程和线程基础知识> <Linux-进程管理> <C语言进程的内存地址空间分配> <进程和线程模型> <(1)Linux进程 ...

  2. Linux线程操作以及相关知识

    1 线程 ◼ 与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机 制.一个进程可以包含多个线程.同一个程序中的所有线程均会独立执行相同程序,且共 享同一份全局内存 ...

  3. [转载]Linux 线程实现机制分析

    自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads ...

  4. Linux 线程的创建与同步

    Linux 线程的创建与同步 1.线程的定义 2.线程的创建和使用 3.理解线程的并发运行 3.线程同步 3.线程的实现 1.线程的定义 线程:进程内部的一条执行路径.是资源调度和执行的基本单位. 进 ...

  5. linux 线程 进程经典文章

    进程是程 序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是 死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程.凡是用于完成操作系统的各种功能的进程就是 ...

  6. linux 线程--内核线程、用户线程实现方法

    Linux上进程分3种,内核线程(或者叫核心进程).用户进程.用户线程 内核线程拥有 进程描述符.PID.进程正文段.核心堆栈 当和用户进程拥有相同的static_prio 时,内核线程有机会得到更多 ...

  7. Linux 线程实现机制分析

    本文转自:http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位 ...

  8. Linux 线程实现机制分析--转

    http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位,线程是程 ...

  9. 进程和线程基础知识(已经是最详细的啦)

    进程和线程基础知识 文章目录 进程和线程基础知识 一.前言 二.进程 1.引入 2.并发和并行有什么区别? 3.进程与程序的关系的类比 4.进程的状态 5.进程的控制结构 6.进程的控制 7.进程的上 ...

最新文章

  1. leetcode算法题--矩阵中的幸运数
  2. Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
  3. markdown一边写一边预览_markdown文章编辑利器-基础篇
  4. [深度学习-实践]tensorflow_hub简单理解模型的生成与加载
  5. struts2的优缺点
  6. Widget改变大小
  7. php netstat,Netstat 命令详解
  8. docker视频教程 百度云网盘
  9. DTcmsV4.0分析学习——(2)系统框架
  10. 4 基于pyecharts的python数据可视化——散点图和折线图的绘制
  11. 秦九韶算法介绍及MATLAB实现
  12. 二叉树先序递归遍历,中序递归非递归遍历实验
  13. 常用软胶材料基本知识
  14. 起底Filecoin:易崩盘、估值高、政策风险大
  15. 可实现一种个人微信二维码收款接口的方法
  16. 连英文都不懂怎么学python_在英语完全不懂的情况下如何学编程?
  17. vue antd table customRender 自定义标签
  18. 【Phase One SDK】飞思相机SDK的环境配置及调用
  19. linux如何给手机刷recovery,教你修改RECOVERY文件教程---转帖原作者为小秋
  20. 简谱打谱软件音乐梦想家与作曲大师有什么不同

热门文章

  1. MobSF移动安全检测框架简述
  2. MapReduce作业在Hadoop完全分布式集群上运行的问题与思考(持续更新)
  3. R语言:三线表(2)
  4. TI FMCW毫米波雷达基础(3)——角度测量原理
  5. 计算机教室课外活动简报,广州图书馆·活动报道·电子阅览室“自助学习月”活动简讯...
  6. html点击除某个元素之外的元素的事件添加技巧
  7. 中文科技论文写作技巧总结
  8. 导出CSV后,时间字段无法自动识别-0xEF,0xBB,0xBF
  9. 适合中介的二手房房源管理系统
  10. scenario知识点总结