Linux系统实现多线程的方式

Linux系统实现多线程的方式
Linux 实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。 Linux 把所有的线程都当做进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯 一隶属于自己的task_struct,所以在内核中,它看起来就像是一个普通的进程(只是线程和 其他一些进程共享某些资源,如地址空间)

线程和进程的区别
进程是资源分配最小单位,线程是程序执行的最小单位;
线程间的切换效率相比进程间的切换要高
进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据;
创建一个线程比进程开销小;
线程占用的资源要⽐进程少很多。
线程之间通信更方便,同一个进程下,线程共享全局变量,静态变量等数据,进程之间的通信需要以通信的方式(IPC)进行;(但多线程程序处理好同步与互斥是个难点)
多进程程序更安全,生命力更强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间),多线程程序更不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间);
进程对资源保护要求高,开销大,效率相对较低,线程资源保护要求不高,但开销小,效率高,可频繁切换;
多线程开发的三个基本概念
线程 【创建、退出、等待】
互斥锁【创建、销毁、加锁】、解锁】
条件【创建、销毁、触发、广播、等待】
线程库的使用
1.创建线程

 

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>

#include<pthread.h>

//声明一个线程函数
void *fun(void *);

int main()
{
    printf("main start\n");

    pthread_t id;
    //创建函数线程,并且指定函数线程要执行的函数
    int res = pthread_create(&id,NULL,fun,NULL);
    assert(res == 0);

    //之后并发运行
    int i = 0;    
    for(; i < 5; i++)
    {
        printf("main running\n");
        sleep(1);
    }

    printf("main over\n");
    exit(0);
}

//定义线程函数
void* fun(void *arg)
{
    printf("fun start\n");

    int i = 0;
    for(; i < 3;i++)
    {
        printf("fun running\n");
        sleep(1);
    }

    printf("fun over\n");
}

 

 

版权声明:本文为CSDN博主「Dutkig」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44824574/article/details/110672780

posted on 2022-12-06 17:15  zxddesk  阅读(642)  评论(0编辑  收藏  举报

导航