17-LINUX--线程与fork()

一.多线程程序+fork()

多线程出现fork()后,只复制一条执行路径,是fork()所在的那条执行路径

主程序+fork()示例代码:

include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>void* fun(void* arg)
{for(int i=0;i<5;i++){printf("fun id=%d\n",getpid());sleep(1);}
}int main()
{pthread_t id;pthread_create(&id,NULL,fun,NULL);fork();for(int i=0;i<5;i++){printf("main pid=%d\n",getpid());sleep(1);}pthread_join(id,NULL);
}
~  

fork()在那个路径,就复制那条路径

在复制的过程中,若被复制函数包含锁这类的代码,会被复制当前锁的状态,但复制完成以后各自有锁,互不影响。

因为这个特性,会导致锁的在其他线程加锁的过程中,主线程或子线程想要加锁会被阻塞。由此我们引入pthread_atfork(*prepare,**parent,*child):

二.pthread_atfork()

在父进程调用fork函数派生子进程的时候,如果父进程创建了pthread的互斥(pthread_mutex_t)对象,那么子进程将自动继承父进程中互斥锁对象,并且互斥锁的状态也会被子进程继承下来:如果父进程中已经加锁的互斥锁在子进程中也是被锁住的,如果在父进程中未加锁的互斥锁在子进程中也是未加锁的。在父进程调用fork之前所创建的pthread_mutex_t对象会在子进程中继续有效,而pthread_mutex_t对象通常是全局对象,会在父进程的任意线程中被操作(加锁或者解锁),这样就无法通过简单的方法让子进程明确知道被继承的 pthread_mutex_t对象到底有没有处于加锁状态。

prepare:将在fork调用创建出子进程之前被执行,它可以给父进程中的互斥锁对象明明确确上锁。这个函数是在父进程的上下文中执行的,正常使用时,我们应该在此回调函数调用 pthread_mutex_lock 来给互斥锁明明确确加锁,这个时候如果父进程中的某个线程已经调用pthread_mutex_lock给互斥锁加上了锁,则在此回调中调用 pthread_mutex_lock 将迫使父进程中调用fork的线程处于阻塞状态,直到prepare能给互斥锁对象加锁为止。

parent: 是在fork调用创建出子进程之后,而fork返回之前执行,在父进程上下文中被执行。它的作用是释放所有在prepare函数中被明明确确锁住的互斥锁。
child: 是在fork返回之前,在子进程上下文中被执行。和parent处理函数一样,child函数也是用于释放所有在prepare函数中被明明确确锁住的互斥锁。

函数成功返回0, 错误返回错误码

prepare是在fork调用之前会被调用的,parent在fork返回(进入)父进程之前调用,child在fork返回子进程之前调用。如果在prepare中加锁所有的互斥量,在parent和child中解锁所有的互斥量,那么在fork返回之后,互斥量的状态就是未加锁。

示例代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/wait.h>pthread_mutex_t mutex;void prepare(void)
{pthread_mutex_lock(&mutex);
}
void parent(void)
{pthread_mutex_unlock(&mutex);
}
void child(void)
{pthread_mutex_unlock(&mutex);
}
void* fun(void*arg)
{pthread_mutex_lock(&mutex);printf("fun lock\n");sleep(3);pthread_mutex_unlock(&mutex);printf("fun unlock\n");
}int main()
{pthread_mutex_init(&mutex,NULL);pthread_t id;pthread_create(&id,NULL,fun,NULL);sleep(1);//子进程已加锁pthread_atfork(prepare,parent,child);pid_t pid = fork();if(pid == -1){exit(1);}if(pid == 0){printf("child 准备加锁\n");pthread_mutex_lock(&mutex);printf("子进程加锁成功\n");pthread_mutex_unlock(&mutex);exit(0);}wait(NULL);printf("main over\n");pthread_join(id,NULL);exit(0);}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《企业科技与发展》是什么级别的期刊?是正规期刊吗?

问题解答 问&#xff1a;《企业科技与发展》期刊怎么样&#xff1f; ​答&#xff1a;企业科技与发展》&#xff08;月刊&#xff09;1985年创刊&#xff0c;由广西科学技术厅主管、广西科学技术情报研究所主办&#xff0c;国内外公开发行。主要栏目:科技对策与研究、企业科技…

unordered_map、unordered_set底层封装

文章目录 一、先实现哈希桶1.1哈希桶的实现方法1.2日常普遍的哈希桶存放的数据有两种&#xff1a;字符串和整形1.3哈希桶的实现代码详解1.3.1哈希桶的两种仿函数&#xff08;int和string&#xff09;1.3.2哈希桶的节点&#xff08;如果桶非常深&#xff0c;这里考虑挂红黑树&am…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

美业收银系统源码-App/iPad/PC管理系统常见问题讲解(1)

博弈美业管理系统源码 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、平板iPad的评论内容&#xff0c;是从哪里评论的呢&#xff1f; 顾客在接受服务后&#xff0c;可以到…

H5 鼠标点击粒子扩散效果

&#x1f9d0;别人的博客中有这样的效果&#xff0c;于是自己就尝试实现了一下。 效果如图 源码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

20240507 ubuntu20.04+ros noetic 跑通lioslam

任务&#xff1a;跑通lioslam 主要参考博客 IMU激光雷达融合使用LIO-SAM建图学习笔记——详细、长文、多图、全流程_ubuntu_AIDE回归线-GitCode 开源社区 (csdn.net) 1.不要用这一句 wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2…

越来越真的Deepfake再次引起网安界的关注

当地时间5月6日&#xff0c;全球网络安全领域最受关注的年度盛会 RSAC 2024在美国旧金山隆重开幕。当天&#xff0c;被誉为“安全圈奥斯卡”的创新沙盒大赛也决出了冠军&#xff0c;Reality Defender凭借其创新性的深度伪造&#xff08;Deepfake&#xff09;检测平台摘得桂冠&a…

ROS2 - 创建项目 (Ubuntu22.04)

本文简述&#xff1a;在 Ubuntu22.04 系统中使用 VS CODE 来搭建一个ROS2开发项目。 1. 创建工作空间 本文使用 Ubuntu 22.04&#xff0c; 已安装配置完成 VS Code&#xff0c;C 环境&#xff08;g/gdb&#xff09; 1.1 创建目录 选择文件夹作为工作空间&#xff0c;并在这…

一篇文章告诉你聚类算法的作用和怎么用聚类算法!建议收藏!(下篇)

EM聚类 EM聚类 基于概率分布对数据进行建模&#xff0c;通过迭代的期望和最大化步骤来估计模型参数&#xff0c;并将数据分为不同的聚类。EM聚类通常用于处理混合分布的数据&#xff0c;其中每个聚类被建模为一个概率分布。 原理介绍 EM聚类的核心思想是将数据集中的每个样本…

AI图像生成-原理

一、图像生成流程总结 【AI绘画】深入理解Stable Diffusion&#xff01;站内首个深入教程&#xff0c;30分钟从原理到模型训练 买不到的课程_哔哩哔哩_bilibili 二、如果只是用comfy UI生成图片 1、找到下面几个文件&#xff0c;把对应模型移动到对应文件夹即可使用 2、选择对…

HarmonyOS应用模型Stage基本介绍

文章目录 <font colorcoral> HarmonyOS应用模型概况<font colorcoral> Stage模型基本概念<font colorcoral> Stage模型UIAbiliry的生命周期<font colorcoral> Stage模型的配置文件<font colorcoral> 写在后面的话<font colorcoral>Referen…

企业为什么需要HTTPS

一.什么是HTTPS HTTPS &#xff08;全称&#xff1a;Hyper Text Transfer Protocol over SecureSocket Layer&#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&a…

并行执行的4种类别——《OceanBase 并行执行》系列 4

OceanBase 支持多种类型语句的并行执行。在本篇博客中&#xff0c;我们将根据并行执行的不同类别&#xff0c;分别详细阐述&#xff1a;并行查询、并行数据操作语言&#xff08;DML&#xff09;、并行数据定义语言&#xff08;DDL&#xff09;以及并行 LOAD DATA 。 《并行执行…

SQL高级语句

主知识点八&#xff1a;窗口函数 新开窗口&#xff0c;不影响原数据的排序。且子句必须有order by。窗口结果返回到 且窗口函数必须写在select后面&#xff01; ● 【排序窗口函数】 ● rank()over()——1,1,3,4 ● dense_rank()over()——1,1,2,3 ● row_number(…

初识java——javaSE(4)类与对象

文章目录 前言一 类与对象1.1 面向过程与面向对象思想的区别&#xff1a;1.2 类的定义1.3 类的实例化——对象通过创建对象&#xff0c;调用对象中的成员变量与方法 1.4 this关键字this的作用一&#xff1a;this 的作用二构造方法&#xff1a;对象创建的两步方法的重载 this的作…

干部谈话考察:精准洞悉,助推成长

在组织人事管理的精细布局中&#xff0c;干部谈话考察扮演着举足轻重的角色。它不仅是组织深度了解干部、精准评价其表现的重要窗口&#xff0c;更是推动干部个人成长、优化组织人才配置的关键一环。通过深入的谈话考察&#xff0c;我们能够全面把握干部的思想脉搏、工作能力、…

人武部三维电子沙盘系统

深圳易图讯科技有限公司(www.3dgis.top)系统采用自主可控高性能可视化三维GIS引擎&#xff0c;支持多用户客户端通过网络请求访问服务器地图和JFQ专题数据&#xff0c;提供地理信息数据、专题数据的并发访问和高效调度加载&#xff0c;依托前端设备采集的重点图像、视频等信息资…

代码随想录day19day20打卡

二叉树 1 二叉树的最大深度和最小深度 最大深度已经学习过了&#xff0c;实质就是递归的去判断左右子节点的深度&#xff0c;然后对其进行返回。 附加两个学习的部分&#xff1a; &#xff08;1&#xff09;使用前序遍历的方法求解 int result; void getdepth(TreeNode* nod…

华为OD机试 - 测试用例执行计划(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

麒麟 V10 安装docker2

1. 查看系统版本 2.安装docker-ce 添加源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker yum install docker-ce --allowerasing 重启docker systemctl start docker 3.安装nvidia-container-runtime 添…