当前位置: 首页 > news >正文

【C语言_线程pthread_互斥锁mutex_条件触发cond 之解析与示例 (开源)】.md updata:23/11/03

文章目录

      • 线程 pthread
        • 线程 vs 进程
        • 线程退出 等待 消息传递
          • join:等待,传参void*; exit:退出,对参数赋值void**;
        • 互斥锁 mutex
          • 互斥锁mutex+条件cond_等待wait、触发signal 控制线程执行
        • 补充: 宏-静态初始化 互斥锁/条件

线程 pthread

线程 vs 进程

线程:直接用主程序的内存地址,所以如果在线程里改主程序变量,就是直接改;
线程vs进程:
a.比进程快大概30倍,不需要复制完全一样的内存来创建运行,直接使用主程序的内存;
b.没有进程那么健壮,子线程蹦了,就都崩了;
而对进程而言,子进程崩了,父进程不受影响继续执行;

线程退出 等待 消息传递
join:等待,传参void*; exit:退出,对参数赋值void**;
#include <stdio.h>
#include <pthread.h>
#include <string.h>//创建线程
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
// 返回:若成功返回0,否则返回错误编号//子线程执行函数func1里的pthread_exit负责将void* 传递给主线程的pthread_joi的void **参数;
//int pthread_exit(void *rval_ptr);// int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号void *func1(void * arg)
{static char data[] = "I am ok! thanks!";printf("t1 id:%d\n",(int)pthread_self());printf("t1 arg data:%s\n",(char* )arg);pthread_exit((void* )data);
}int main()
{pthread_t t1;char arg[] = "Are you ok?";char data1[1024];memset(data1,'\0',sizeof(data1));printf("main id:%d\n",(int)pthread_self());int creatN = pthread_create(&t1,NULL,func1, (void*)arg); //创建其他线程,也是类似操作: 定义好执行函数func2,和传入的形参arg2即可;//pthread_create(&t2,NULL,func2, (void*)arg2); void* ret;pthread_join(t1,&ret);strcpy(data1, (char*)ret);printf("t1 return data:%s\n",data1);return 0;
}
互斥锁 mutex

互斥锁:我上锁,你就不能用了,除非我解锁了,你才能用;
配合线程使用;

互斥锁mutex+条件cond_等待wait、触发signal 控制线程执行

//例:

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>/*-----------------------------------------------------*/
// 创建互斥锁变量 
//pthread_mutex_t 锁名
// 初始化及销毁互斥锁
// int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
// int pthread_mutex_destroy(pthread_mutex_t mutex);
// 返回:若成功返回0,否则返回错误编号//上锁 例:pthread_mutex_lock(&mutex);
//解锁 例:pthread_mutex_unlock(&mutex);/*-----------------------------------------------------*/// 创建条件变量 
//pthread_cond_t 条件名
// 初始化及销毁条件变量
// int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); //消息只给一个线程
// int pthread_cond_destroy(pthread_cond_t *cond);  //广播给所有线程
// 返回:若成功返回0,否则返回错误编号// 等待
// int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
// int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cond struct timespec *restrict timeout);
// 返回:若成功返回0,否则返回错误编号//触发
// int pthread_cond_signal(pthread_cond_t *cond);
// int pthread_cond_broadcast(pthread_cond_t *cond);
// 返回:若成功返回0,否则返回错误编号/*-----------------------------------------------------*/int numNB = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;void *func1(void * arg)
{printf("t1 id:%ld\n",(unsigned long)pthread_self());printf("t1 get main data:%s\n",(char* )arg);while(1){pthread_cond_wait(&cond,&mutex);printf("--------------------\n");printf("t1:%d\n",numNB++);printf("--------------------\n");sleep(1);numNB = 0;}}void *func2(void * arg)
{printf("t2 id:%ld\n",(unsigned long)pthread_self());printf("t2 get main data:%s\n",(char* )arg);while(1){pthread_mutex_lock(&mutex);                printf("t2:%d\n",numNB++);pthread_mutex_unlock(&mutex);if(numNB == 3){pthread_cond_signal(&cond); }     sleep(1);   } 
}int main()
{pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);pthread_t t1,t2;void* ret;char arg[] = "Are you ok?";char data1[1024];memset(data1,'\0',sizeof(data1));int creatN1 = pthread_create(&t1,NULL,func1, (void*)arg);int creatN2 = pthread_create(&t2,NULL,func2, (void*)arg);printf("main id:%ld\n",(unsigned long)pthread_self());pthread_join(t1,&ret);pthread_join(t2,&ret);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}
补充: 宏-静态初始化 互斥锁/条件
//在main函数里,不用宏,pthread_mutex_init() 正常初始化锁/条件的,即为动态初始化
//例:
pthread_mutex_t mutex;
int main()
{pthread_mutex_init(&mutex,NULL);return 0;
}//在定义互斥锁/条件变量时,使用默认宏直接完成初始化,即为静态初始化
//例:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

相关文章:

【C语言_线程pthread_互斥锁mutex_条件触发cond 之解析与示例 (开源)】.md updata:23/11/03

文章目录 线程 pthread线程 vs 进程线程退出 等待 消息传递join:等待&#xff0c;传参void*&#xff1b; exit:退出&#xff0c;对参数赋值void**; 互斥锁 mutex互斥锁mutex条件cond_等待wait、触发signal 控制线程执行 补充: 宏-静态初始化 互斥锁/条件 线程 pthread 线程 vs…...

mongodb如何删除数据并释放空间

mongodb删除数据后不会直接释放内存空间&#xff0c;是因为使用了一种称为“延迟删除”的策略。这意味着当一个文档被删除时&#xff0c;它仍然会占用一定的内存空间&#xff0c;直到这个空间被垃圾回收器&#xff08;Garbage Collector&#xff09;回收。 删除数据操作前建议先…...

k8s之集群调度

目录 调度 工作机制 调度过程 调度算法 优先级 指定调度节点 调度 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令…...

代码随想录算法训练营第四十二天丨 动态规划part05

1049.最后一块石头的重量II 思路 本题其实就是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最小&#xff0c;这样就化解成01背包问题了。 感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。 本题物品的重量为 stones[i]&#xff0c;物品的价…...

[css] flex 子元素自动撑开父元素宽度

对于水平排列的情况&#xff0c;我们可以设置父元素的flex-direction属性为row。这样&#xff0c;子元素将会水平排列在一行内&#xff0c;并自动撑开父元素的宽度。如果子元素的宽度总和超过了父元素的宽度&#xff0c;则子元素会被压缩&#xff0c;以适应父元素的宽度。 对于…...

全新干货!一招教你迅速提升流量主收入!包你轻松月入过万

也不怕大家笑话&#xff0c;才哥以前收入每天才一块钱&#xff0c;连瓶水都买不了&#xff0c; 可是自从我开始接触老年粉私域后&#xff0c;一个搬运公众号的流量主收益两个月后就可以用“浴火重生”来形容了。 一个搬运公众号一天的流量主收益比我原创两年的个人公众号收益还…...

连接两个dataframe

concat import pandas as pd df1 pd.DataFrame({‘A’: [1, 2, 3], ‘B’: [4, 5, 6]}) df2 pd.DataFrame({‘A’: [7, 8, 9], ‘B’: [10, 11, 12]}) result pd.concat([df1, df2]) # 在行上连接 merge import pandas as pd df1 pd.DataFrame({‘key’: [‘A’, ‘B…...

【入门Flink】- 05Flink运行时架构以及一些核心概念

系统架构 Flink运行时架构Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager 是一个 Flink 集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。每个应用都应该被唯一的 JobManager 所控制执行。 JobManger 又包含…...

网络协议的基本概念

网络协议的基本概念 随处可见的协议 在计算机网络与信息通信领域里&#xff0c;人们经常提及“协议”一词。互联网中常用的具有代表性的协议有IP、TCP、HTTP等。 “计算机网络体系结构”将这些网络协议进行了系统归纳。TCP/IP就是IP、TCP、HTTP等协议的集合。现在&#xff0…...

广汽传祺E9上市,3DCAT实时云渲染助力线上3D高清看车体验

今年5月21日&#xff0c;中国智电新能源旗舰MPV——广汽传祺智电新能源E9在北京人民大会堂举办上市发布会。 发布会现场&#xff08;图源官方&#xff09; 为了让更多的消费者能够在线上感受到广汽传祺E9的魅力&#xff0c;3DCAT实时渲染云与大圣科技合作为广汽传祺打造了一款…...

resource manager attributes structure(iofunc_attr_t) 扩展实例

文章目录 前言一、attributes structure(iofunc_attr_t)是什么二、iofunc_attr_t 扩展实例1. iofunc_attr_t 未扩展前的使用实例2. iofunc_attr_t 扩展后的使用实例总结参考资料前言 本文主要介绍如何扩展 QNX resource manager 的 attributes structure(iofunc_attr_t) 属性数…...

劳易测扫码条码分段读取实现方法

添加如下3个功能块&#xff1a;M10&#xff0c;M13和M27 设置BCL参数&#xff1a;Code type 1 为Code128 参数&#xff1a;Mode为Range 参数&#xff1a;Number Of digits 1 为条码最小长度 Number Of digits 2 为条码最大长度。 设置M10&#xff1a;Mode&#xff08;With …...

【Linux】Nignx及负载均衡动静分离

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…...

AI:50-基于深度学习的柑橘类水果分类

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

mysql 中!= 到底走不走索引?

mysql 中! 到底走不走索引&#xff1f; 很多人疑惑! 到底走不走索引&#xff0c; 这里可以肯定的说该操作是可以走索引的&#xff0c;但实际情况中都为啥都不走索引呢&#xff1f; 首先我们要知道走索引与数据量和数据趋势&#xff08;cardinality&#xff09;有很大的关系&…...

4 sql语法基础

1、DISTINCT 相同值只会出现一次。它作用于所有列&#xff0c;也就是说所有列的值都相同才算相同。 2、LIMIT 限制返回的行数。可以有两个参数&#xff0c;第一个参数为起始行&#xff0c;从 0 开始&#xff1b;第二个参数为返回的总行数。 返回前 5 行: SELECT * FROM myt…...

网络工程师应知应会:基础知识(5)

一、防火墙区域结构 防火墙按安全级别不同&#xff0c;可划分为内网、外网和 DMZ 区。 (1) 内网。 内网是防火墙的重点保护区域&#xff0c;包含单位网络内部的所有网络设备和主机。该区域是可信的&#xff0c;内网发出的连接较少进行过滤和审计。 (2) 外网。 外网是防火墙重…...

Minio多节点多驱动分布式部署官网文档翻译

原文链接&#xff1a; Deploy MinIO: Multi-Node Multi-Drive — MinIO Object Storage for Linux The procedures on this page cover deploying MinIO in a Multi-Node Multi-Drive (MNMD) or “Distributed” configuration. MNMD deployments provide enterprise-grade p…...

python连接clickhouse (CK)

Author: tkhywang 2810248865qq.com Date: 2023-11-01 11:28:58 LastEditors: tkhywang 2810248865qq.com LastEditTime: 2023-11-01 11:36:25 FilePath: \PythonProject02\Python读取clickhouse2 数据库数据.py Description: 这是默认设置,请设置customMade, 打开koroFileHead…...

【C++】内联函数一看就懂?

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

保姆级教程:用CST 2023的RLC求解器搞定空心电感仿真(附网格优化技巧)

从零到精通的CST空心电感仿真实战指南&#xff1a;RLC求解器与网格优化全解析 在电磁兼容设计和高频电路开发中&#xff0c;空心电感作为无磁芯干扰的理想元件&#xff0c;其精确建模一直是工程师的痛点。传统手工计算难以应对复杂的高频效应&#xff0c;而商业仿真软件的门槛…...

RMBG-2.0企业级应用:集成至Shopify后台实现订单图自动去背流水线

RMBG-2.0企业级应用&#xff1a;集成至Shopify后台实现订单图自动去背流水线 想象一下&#xff0c;你是一家Shopify店铺的运营负责人。每天&#xff0c;团队需要处理上百张来自不同供应商的商品图片&#xff0c;手动抠图、换背景&#xff0c;只为让商品主图在网站上看起来统一…...

手把手教你为OpenBMC (AST2600平台) 正确配置PCA9545 I2C Switch的DTS节点

深入解析AST2600平台PCA9545 I2C Switch设备树配置实战指南 在嵌入式系统开发中&#xff0c;I2C总线扩展是连接多个外设的常见需求。NXP的PCA9545作为一款4通道I2C总线开关芯片&#xff0c;能够有效解决I2C地址冲突问题&#xff0c;但在实际应用中&#xff0c;设备树(DTS)配置…...

任天堂Switch大气层系统终极指南:7步完成自定义固件安装与虚拟系统配置

任天堂Switch大气层系统终极指南&#xff1a;7步完成自定义固件安装与虚拟系统配置 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层系统&#xff08;Atmosphere&#xff09;是任天堂…...

Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战

Windows右键菜单重构指南&#xff1a;从混乱到高效的ContextMenuManager实战 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 问题诊断&#xff1a;你的右键菜单是…...

Mojo嵌入Python项目的4种架构模式(含GIL绕过实测数据+内存安全验证报告)

第一章&#xff1a;Mojo嵌入Python项目的4种架构模式&#xff08;含GIL绕过实测数据内存安全验证报告&#xff09;Mojo 作为兼具 Python 兼容性与系统级性能的新兴语言&#xff0c;其嵌入 Python 项目的能力已通过多种生产就绪架构得到验证。以下四种主流集成模式均在 macOS Ve…...

CHORD-X深度研究报告生成:集成MySQL进行数据存储与管理的配置指南

CHORD-X深度研究报告生成&#xff1a;集成MySQL进行数据存储与管理的配置指南 如果你正在使用CHORD-X这类强大的研究报告生成工具&#xff0c;可能会遇到一个甜蜜的烦恼&#xff1a;生成的内容越来越多&#xff0c;数据越来越杂&#xff0c;怎么才能把它们管得井井有条&#x…...

uView Input前后槽实战:5分钟搞定搜索框+验证码组合

uView Input前后槽实战&#xff1a;5分钟搞定搜索框验证码组合 在移动端开发中&#xff0c;输入框(Input)是最基础也是最常用的UI组件之一。无论是用户登录、搜索功能还是表单填写&#xff0c;都离不开它。但你是否遇到过这样的困扰&#xff1a;想要在输入框左侧添加一个搜索图…...

【Cornerstone3D实战】从零构建医学影像三视图渲染器:Dicom文件加载与多平面重建

1. 医学影像三视图渲染器入门指南 第一次接触医学影像开发的朋友可能会被"Dicom"、"三视图重建"这些专业术语吓到。其实用现代Web技术实现一个基础的医学影像查看器&#xff0c;比你想象中简单得多。Cornerstone3D这个开源库就像医学影像界的jQuery&#x…...

Phi-4-mini-reasoning惊艳效果:线性代数矩阵运算推理全过程展示

Phi-4-mini-reasoning惊艳效果&#xff1a;线性代数矩阵运算推理全过程展示 1. 模型概述 Phi-4-mini-reasoning是一款仅有3.8B参数的轻量级开源模型&#xff0c;专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这款模型由微软Azure AI Foundry开发&#xff0c;主打"…...