Linux——线程 一

什么是线程?
在一个程序里的一个执行路线就叫做线程(线程是一个进程内部的控制序列)
一切进程至少都有一个执行线程


进程和线程区别?
进程是资源竞争的基本单位
线程是程序执行的最小单位
线程共享进程数据,但也拥有自己的一部分数据
如:线程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 相互交叉运行着。由系统每个线程的调度优先级决定该运行那个线程。

这篇文章只是介绍了进程和线程的相关概念,并没有说到线程的安全性。在博主的操作系统中会找到线程更进一步的学习。

扫描二维码关注公众号,回复: 2490473 查看本文章

猜你喜欢

转载自blog.csdn.net/Shawei_/article/details/81282281