码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Linux高并发服务器开发(六)线程


    文章目录

    • 1. 前言
    • 2 线程相关操作
    • 3 线程的创建
    • 4 进程数据段共享和回收
    • 5 线程分离
    • 6 线程退出和取消
    • 7 线程属性(了解)
    • 8 资源竞争
    • 9 互斥锁
      • 9.1 同步与互斥
      • 9.2 互斥锁
    • 10 死锁
    • 11 读写锁
    • 12 条件变量
    • 13 生产者消费者模型
    • 14 信号量
    • 15 哲学家就餐


    1. 前言

    进程是CPU 分配资源的最小单位, 线程是系统调度的最小单位。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如果复制对方的地址空间,就产生出一个进程
    如果共享对方的地址空间,就产生一个线程
    在这里插入图片描述

    2 线程相关操作

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    3 线程的创建

    在这里插入图片描述
    在这里插入图片描述

    4 进程数据段共享和回收

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    资源回收
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5 线程分离

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    主进程退出,线程也会退出

    6 线程退出和取消

    在这里插入图片描述

    在这里插入图片描述

    线程取消
    在这里插入图片描述

    在这里插入图片描述

    7 线程属性(了解)

    在这里插入图片描述

    8 资源竞争

    打印机模型
    在这里插入图片描述

    9 互斥锁

    9.1 同步与互斥

    在这里插入图片描述、
    互斥: 同一时刻只能一个人使用,必须等一个线程运行完毕,在执行另一个线程。
    同步: 使用先后顺序,按次序完成特定的任务。比如A线程的运行依赖于B任务产生的数据。他也是一种互斥,但有先后顺序。

    9.2 互斥锁

    防止同一个资同时被多个任务使用。

    在这里插入图片描述

    初始化互斥锁
    在这里插入图片描述
    销毁
    在这里插入图片描述
    上锁
    在这里插入图片描述

    解锁
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    10 死锁

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    11 读写锁

    读写锁是一个锁,读锁和写锁都是也给锁中的东西
    在这里插入图片描述
    在这里插入图片描述
    初始化

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    12 条件变量

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    13 生产者消费者模型

    在这里插入图片描述
    在这里插入图片描述

    #include
    #include
    #include
    
    #include
    #include  
    
    
    
    typedef struct _node_t
    {
        int data;
        struct _node_t *next;
        
    }node_t;
    
    node_t *head = NULL;
    
    pthread_cond_t cond;
    pthread_mutex_t mutex;
    
    void *producer(void* arg)
    {
        while(1)
        {
            pthread_mutex_lock(&mutex);
    
            node_t *new = malloc(sizeof(node_t));
            if(NULL == new)
            {
                printf("malloc failed");
                break;
            }
    
            memset(new, 0 ,sizeof(node_t));
    
            new->data = random() % 100 +1;
    
            new->next = NULL;       
    
            new->next = head;
            head = new;
            printf("生产者生产产品 %d\n", new->data);
    
            pthread_mutex_unlock(&mutex);
    
            pthread_cond_signal(&cond);
            sleep(random()%3 +1);
        }
        return  NULL;
    
    }
    
    void *customer(void* arg)
    {
        node_t *tmp = NULL;
        // 循环消费
        while(1)
        {
            pthread_mutex_lock(&mutex);
            if(NULL == head)
            {
                // 等待 
                printf("产品链表为空");
                pthread_cond_wait(&cond, &mutex);
            }
            else
            {
                // 删除第一个节点
                tmp = head;
                head = head->next;
    
                printf("消费者消费 %d\n", tmp->data);
                free(tmp);
    
                pthread_mutex_unlock(&mutex);
    
                sleep(random() %3 +1);
            }
    
    
        }
    
        return  NULL;
    
        
    }
    
    
    int main()
    {
        pthread_t tid1 = -1, tid2 = -1;
    
        srandom(getpid());
    
        int ret = -1;
        ret = pthread_mutex_init(&mutex, NULL);
        if(0!= ret)
        {
            printf("pthread_cond_inti failed");
            return 1;
    
        }
        ret = pthread_cond_init(&cond, NULL);
            if(0!= ret)
        {
            printf("pthread_cond_inti failed");
            return 1;
    
        }
    
        // 创建线程 生产者线程和消费者线程
        pthread_create(&tid1, NULL, producer, NULL);
    
        pthread_create(&tid2, NULL, customer, NULL);
    
    
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
    
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);
    
        return 0;
    }
    

    14 信号量

    在这里插入图片描述
    P操作,占用资源
    V操作,释放资源

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    15 哲学家就餐

    在这里插入图片描述

  • 相关阅读:
    AI工具-PPT-SlidesAI
    某攻防演练心得之随笔记
    记一次 .NET 某药材管理系统 卡死分析
    golang工程——grpc 连接池简单实现
    接口测试框架实战 | 流程封装与基于加密接口的测试用例设计
    on java8之初始化和清理
    【飞控开发高级教程4】疯壳·开源编队无人机-360 度翻滚
    数据结构与算法之复杂度
    手撕JavaScript面试题
    七大排序算法
  • 原文地址:https://blog.csdn.net/Lmz_0314/article/details/140033106
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号