什么是线程?
在一个程序里的一个执行路线就叫做线程(线程是一个进程内部的控制序列)
一切进程至少都有一个执行线程
进程和线程区别?
进程是资源竞争的基本单位
线程是程序执行的最小单位
线程共享进程数据,但也拥有自己的一部分数据
如:线程ID,一组寄存器,栈,调度优先级,信号屏蔽字,errno
多个线程平分进程的一栈
进程中那些资源是线程共享的?
进程定义的函数,全局变量,线程都可以访问
文件描述符表
每种信号的处理方式
当前工作目录
用户ID和组ID
既然说进程中至少都有一个执行线程,我们画个图看看他们的关系:
我们知道了线程是进程中的一部分,那么为什么会有线程?
线程的优点:
1.创建一个新线程的代价要比创建一个新进程小的多
2.与进程之间切换相比,线程切换的代价要小
3.线程占用的资源比进程少很多
4.能够充分利用多处理器的可并行数量
5.在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
6.计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
7.I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O的操作
线程的缺点:
1,性能损失:
如果计算密集型线程的数量比处理器多,那么可能会有较大的性能损失,增加了额外的同步和调度开销
2.健壮性降低
编写多线程时需要更全面更深入的考虑,线程之间共享了不该共享的变量而造成不良影响的可能性很大。线程之间缺乏保护。
3.缺乏访问控制
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响
4.编程的难度提高
编写与调试一个多线程程序比单线程程序困难的很多
我们了解了线程与进程之间的关系,下面我们创建一个线程:
int pthread_create(pthread_t *thread, //线程标识符
const pthread_attr_t *attr, // 属性,NULL
void *(*start_routine) (void *), //线程的回调函数
void *arg);//线程处理函数的参数
返回值:0,表示真 失败:返回错误码
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
void *rout(void *arg) //回调函数
{
while(1)
{
printf("i am thread 1\n");
sleep(1);
}
}
int main()
{
pthread_t tid;
int ret = 0;
ret = pthread_create(&tid,NULL,rout,NULL); //创建线程
if(ret != 0)
{
fprintf(stderr,"pthread_create: %s \n",strerror(ret));
exit(EXIT_FAILURE);
}
int i = 0;
while(1)
{
printf("i am main thread\n");
sleep(1);
}
return 0;
}
我们看程序运行的结果:
主线程和线程1 相互交叉运行着。由系统每个线程的调度优先级决定该运行那个线程。
这篇文章只是介绍了进程和线程的相关概念,并没有说到线程的安全性。在博主的操作系统中会找到线程更进一步的学习。