线程的定义:
线程是进程中的一个执行序列
Linux与Windows上线程的区别:
Linux操作系统实现线程的机制比较的特殊,从内核的角度来讲,Linux上把所有的线程都当做进程来实现,内核中没有特别的准备调度算法和数据结构来表征线程,相反,线程仅仅被视为一个与其他进程共享某些资源的进程,每个线程都拥有自己唯一的task_struct(PCB),所以在内核中他就像是一个普通的进程,只是和其他进程共享某些资源,如地址空间等
Windows上为线程提供了专门的机制用来支持线程,因此在Windows上也把线程称为 轻量级的进程,这种叫法本身就包含了Linux上线程与其他操作系统上线程的区别, 相比于重量级的进程,线程被抽象为一种耗费较少资源,迅速运行的执行单元. 但对于Linux其本身的进程相比而言已经很"轻"了;
线程同步的几个方法:
信号量 互斥锁 条件变量(实现要依赖于互斥锁) 读写锁
线程安全:
安全即保证线程能正确的运行出结果
实现线程安全的两个点: 1. 要注意线程同步
2.要使用线程安全的函数,例如strtok和strtok_r
strtok函数的实现中可能有全局变量或者静态变量来标识切割位置,不是一个线程安全的函数
几种线程的实现方式:
如图:
这三种方式中:
1.纯粹的用户级里线程的创建是由线程库来完成的,因此在内核不参与这个过程,也就意味着内核不知道有线程的存在,它只能管理进程,因此,当程序在多处理机上运行时,无法实现多线程的并行处理,主要是内核不知道线程的信息,无法管理.
2.纯粹的内核级里内核正好是可以对线程进行控制的,因此在多处理机上可以实现线程的并行,但是这样对内核来讲多了一些工作量
3.组合型是将前两种的一个集合
线程的大小:
1.一个程序的运行的线程数和 线程栈的大小 总进程数 等原因的限制:
ulimit -a 这个命令可以看到系统中各个限制条件,例如,最多运行的进程数,一个线程的线程栈的大小
ulimit -s 5120 在此终端上将线程的线程栈设置为5120大小
ulimit -u 2048 在此终端上将最大进程数设置为2048
线程与fork:
1. 多线程执行 fork:
父进程的有多个线程,fork出的子进程只启用一个线程的执行路径,在那个线程内调用fork就跟随哪条路径
2. 多线程中使用 锁 ,fork在进行fork时会得到属于自己的锁,和父进程的独立,但是会受到之前锁的状态的影响,因此注意使用
pthread_atfork(); 这个函数
知识扩充:
1. strace 命令可以跟踪程序执行中系统调用函数的使用
2. ltrace 命令可以跟踪程序执行中库函数的调用
3. ps -eLf | grep run 命令可以过滤出run进程中的线程信息,并且显示
4. fork vfork clone 的底层实现都是依靠 do_fork函数
5. 掌握多线程的调试方法
思考:
1. 主函数执行之前打印 "hello wold"怎么做到?
2. 主函数执行完后打印 "hello wold"怎么做到?
3, 一个进程可以创建多少个线程,限制条件是什么?