基于linux下的高并发服务器开发(第三章)- 3.12 生产者和消费者模型

news2024/9/29 7:27:59

/*
    生产者消费者模型(粗略的版本)
*/
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

// 创建一个互斥量
pthread_mutex_t mutex;

struct Node{
    int num;
    struct Node *next;
};

// 头结点
struct Node * head = NULL;

void * producer(void * arg) {

    // 不断的创建新的节点,添加到链表中
    while(1) {
        pthread_mutex_lock(&mutex);
        struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
        newNode->next = head;
        head = newNode;
        newNode->num = rand() % 1000;
        printf("add node, num : %d, tid : %ld\n", newNode->num, pthread_self());
        pthread_mutex_unlock(&mutex);
        usleep(100);
    }

    return NULL;
}

void * customer(void * arg) {

    while(1) {
        pthread_mutex_lock(&mutex);
        // 保存头结点的指针
        struct Node * tmp = head;

        // 判断是否有数据
        if(head != NULL) {
            // 有数据
            head = head->next;
            printf("del node, num : %d, tid : %ld\n", tmp->num, pthread_self());
            free(tmp);
            pthread_mutex_unlock(&mutex);
            usleep(100);
        } else {
            // 没有数据
            pthread_mutex_unlock(&mutex);
        }
    }
    return  NULL;
}

int main() {

    pthread_mutex_init(&mutex, NULL);

    // 创建5个生产者线程,和5个消费者线程
    pthread_t ptids[5], ctids[5];

    for(int i = 0; i < 5; i++) {
        pthread_create(&ptids[i], NULL, producer, NULL);
        pthread_create(&ctids[i], NULL, customer, NULL);
    }

    for(int i = 0; i < 5; i++) {
        pthread_detach(ptids[i]);
        pthread_detach(ctids[i]);
    }

    while(1) {
        sleep(10);
    }

    pthread_mutex_destroy(&mutex);

    pthread_exit(NULL);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/804436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序授权登录时先判断是否勾选协议再弹出获取手机号的弹窗

思路&#xff1a;设置两个一样的按钮&#xff0c;一个用来判断是否已勾选&#xff1b;另一个是授权登录的按钮&#xff0c;用来获取用户信息 <button class"btn1" wx:if"{{ checked1}}" open-type"getPhoneNumber" bindgetphonenumber"g…

【每日一题】2050. 并行课程 III

【每日一题】2050. 并行课程 III 2050. 并行课程 III题目描述解题思路 2050. 并行课程 III 题目描述 给你一个整数 n &#xff0c;表示有 n 节课&#xff0c;课程编号从 1 到 n 。同时给你一个二维整数数组 relations &#xff0c;其中 relations[j] [prevCoursej, nextCour…

Jetson全系列平台升级命令合集

进入刷机模式: NVIDIA Jetson是通过Micro-USB/USB TYPE-C接口升级系统(具体参考不同载板说明),更新前需让Jetson进入Recovery 模式。Recovery 模式下可以进行文件系统更新包含: 内核Kernel,启动Bootloader,文件系统Filesystem等。 进入 Recovery 模式的步骤: 1)关闭系…

WEB APIs day4 (2)

三、M端事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

数据安全:DataSecurity Plus

随着数字化时代的来临&#xff0c;数据成为了企业和个人生活中不可或缺的一部分。然而&#xff0c;数据的增长和广泛应用也带来了许多安全挑战。数据泄露、黑客攻击和恶意软件成为了威胁数据安全的主要因素。在这个充满风险的环境中&#xff0c;DataSecurity Plus作为一种强大的…

计算机二级Python基本操作题-序号42

1. 根据斐波那契数列的定义&#xff0c;F(0)0&#xff0c;F(1)1&#xff0c;F(n)F(n-1)F(n-2)(n>2)&#xff0c;输出不大于50的序列元素。 例如&#xff1a;屏幕输出示例为&#xff1a; 0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;…&#xff08;略…

docker部署vue项目

材料&#xff1a; 1.打包好的vue的dist文件夹 2.docker环境 运行环境结构图&#xff1a; dist&#xff1a;打包的项目 default.conf: nginx的配置文件 gzip on; #开启或关闭gzip on off gzip_disable "msie6"; gzip_buffers 4 16k; gzip_comp_level 8; gzip_typ…

Nuclei漏洞扫描工具

Nuclei漏洞扫描工具&#xff1a; Nuclei 是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发&#xff0c;具有很强的可配置性、可扩展性和易用性。 提供 TCP、DNS、HTTP、FILE 等各类协议的扫描&#xff0c;通过强大且灵活的模板&#xff0c;可以使用 Nucl…

电商运营的方法

1、以后干,不如现在干 1.1 做代理,搞研发 1.2 自建店铺,去看其他店铺的设计样板 1.3 记住网店挣钱三要点:装修,物流,产品资源 1.4 记住你的职责,让别人明白怎么做,仔细看资料,搞清楚细节 2、如何打开机器人 3.设置自动回复 Ctrl + tab 4.如何做基础销量,做一个刷…

查看8080端口会不会被占用

相关命令 查看8080端口会不会被占用 netstat -ano | findstr 8080 查看 终止占用端口xxx的进程 taskkill /f /pid xxx 具体步骤 第一步&#xff1a;点击起始菜单&#xff08;或是通过winR快捷键&#xff09;&#xff0c;在输入框中输入cmd&#xff0c;点击确定&#x…

十七章:FickleNet:使用随机推理进行弱监督和半监督语义图像分割

0.摘要 弱监督语义图像分割的主要障碍在于从粗糙的图像级注释中获取像素级信息的难度。大多数基于图像级注释的方法使用从分类器获得的定位地图&#xff0c;但这些地图仅关注对象的小区别部分&#xff0c;不捕捉精确的边界。FickleNet探索由通用深度神经网络创建的特征图上的各…

环境搭建-Ubuntu20.04.6系统TensorFlow BenchMark的GPU测试

1. 下载Ubuntu20.04.6镜像 登录阿里云官方镜像站&#xff1a;阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2. 测试环境 Server OS&#xff1a;Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-155-generic x86-64 Docker Version&#xff1a;24.0.5, build ced0996 docker-com…

MSP432自主开发笔记5:IIC通信移植与驱动AT24Cxx存储芯片

今日学习移植MSP432的IIC总线协议&#xff0c;并用此驱动AT24C02芯片实现写入以及读取的功能&#xff0c;然后实现打印开机复位次数的效果。 文章贴出测试工程&#xff0c;测试截图&#xff0c;测试代码~ 其实是实在看不懂MSP432有关于FLASH存储操作相关的英文手册与例程&…

怎么学习Java并发编程相关技术? - 易智编译EaseEditing

学习Java并发编程可以通过多种方式进行&#xff0c;包括但不限于以下几种&#xff1a; 在线教程和学习平台&#xff1a; 网上有许多免费和付费的Java并发编程教程和学习平台&#xff0c;如Coursera、Udemy、edX、Codecademy等。这些平台提供结构化的课程和练习&#xff0c;适…

Goby 漏洞发布|Metabase JDBC 远程代码执行漏洞(CVE-2023-38646)

漏洞名称&#xff1a;Metabase JDBC 远程代码执行漏洞&#xff08;CVE-2023-38646&#xff09; English Name&#xff1a;Metabase JDBC Remote Code Execution Vulnerability (CVE-2023-38646) CVSS core: 9.8 影响资产数&#xff1a;66604 漏洞描述&#xff1a; Metabas…

初识计算机系统

计算机系统是由硬件和系统软件组成的&#xff0c;它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化&#xff0c;但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件&#xff0c;它们又执行着相似的功能。 一、信息就是位上下文 我们通…

Python基础入门教程(上)

目录 一、你好Python 1.1、Python安装 win版 Linux版 1.2、第一个Python程序 二、Python基本语法 2.1、字面量 2.2、注释 2.3、变量 2.4、数据类型 type()函数 字符串类型的不同定义方式 2.5、数据类型转换 ​编辑 2.6、标识符 2.7、运算符 2.8、字符串扩展 …

教育机构视频播放时观看行为分析有哪些应用?

教育机构视频播放时观看行为分析有哪些应用&#xff1f; 观看行为分析 观看行为分析是指我们平台基于视频大数据分析&#xff0c;能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示&#xff0c;我们平台云点播视频的每一次播放&#xff0…

脚手架 --- command框架<一>

版本&#xff1a;6.0.0 假设脚手架名称&#xff1a;big-cat-cli 实例化 const commander require(commander) const program new commander.Command()program 基本信息配置 program.name(Object.keys(pkg.bin)[0]) // 赋值name, 显示在useage 前部分.usage(<command>…

产品开发八大模块交流︱奇瑞新能源汽车产品开发院院长荣升格

奇瑞新能源汽车股份有限公司研发中心/产品开发院院长荣升格先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;产品开发八大模块交流。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; VUCA时代…