欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Linux高并发服务器开发(六)线程

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

2025/2/2 1:45:33 来源:https://blog.csdn.net/Lmz_0314/article/details/140033106  浏览:    关键词: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<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 哲学家就餐

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com