Linux高并发服务器开发(六)线程


1. 前言

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

2 线程相关操作

在这里插入图片描述

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

在这里插入图片描述

3 线程的创建

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

4 进程数据段共享和回收

在这里插入图片描述

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

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

5 线程分离

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

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

6 线程退出和取消

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

7 线程属性(了解)

在这里插入图片描述

8 资源竞争

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

9 互斥锁

9.1 同步与互斥

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

9.2 互斥锁

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

在这里插入图片描述

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

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

10 死锁

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

在这里插入图片描述

11 读写锁

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

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

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

12 条件变量

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

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

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

13 生产者消费者模型

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

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

#include<pthread.h>
#include <unistd.h> 



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 哲学家就餐

在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值