17-LINUX--线程与fork()

news2025/1/11 0:54:16

一.多线程程序+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.coloradmin.cn/o/1665137.html

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

相关文章

ERA5数据的区别

ERA5 hourly data on single levels from 1940 to present 链接 ERA5是欧洲中期天气预报中心(ECMWF)的第五代全球气候和天气再分析产品&#xff0c;涵盖过去80年的数据。数据可从1940年开始获取&#xff0c;ERA5取代了ERA-Interim再分析产品。 再分析将全球范围内的模型数据与…

39-5 入侵检测系统(IDS)- 安装配置IDS(注意我没安装成功,阅读需谨慎)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…

毕业论文凑字数——关于IVR自动语音应答交互式电话导航自动总机等等概念的一些剖析

目录 IVR毕业论文的讨巧思路IVR自动语音应答IVR的使用流程IVR的各种应用IVR的基本配置 一个小朋友的毕业论文要凑字数&#xff0c;所以推荐她讲一讲IVR&#xff0c;因为IVR可以翻译的名字很多&#xff0c;比如交互式语音应答&#xff0c;自动语音应答&#xff0c;自动语音服务&…

C++容器——list

目录 list容器 list容器使用流程 加入头文件 定义 list容器的使用 添加元素&#xff1a; 删除元素&#xff1a; 访问元素&#xff1a; 容器大小&#xff1a; 迭代器操作&#xff1a; 其他操作&#xff1a; list容器 功能&#xff1a;将数据进行链式存储 链表(list…

Java的时间类

1. 日期类 1.1 第一代日期类 1) Date: 精确到毫秒&#xff0c;代表特定的瞬间 2) SimpleDateFormat: 格式和解析日期的类 SimpleDateFormat 格式化和解析日期的具体类。它允许进行格式化(日期-→>文本)、解析(文本->日期)和规范化. import java.text.ParseExce…

catia涡轮蜗杆建模和装配和仿真

01 建模 001 蜗杆 step 1 在草图工作区间&#xff0c;画出蜗杆的正视面上半部分&#xff0c;标注好尺寸&#xff0c;使用旋转命令得到蜗杆轮廓&#xff0c;使用倒圆角命令&#xff0c;导出圆角。 step2 画螺旋线&#xff0c;先使用创建点命令&#xff0c;创建出一个坐标点&…

通过物联网管理多台MQTT设备-基于米尔T527开发板

本篇测评由电子工程世界的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-LT527开发板的网关方案测试。 一、系统概述 基于米尔-全志 T527设计一个简易的物联网网关&#xff0c;该网关能够管理多台MQTT设备&#xff0c;通过MQTT协议对设备进行读写操作&#xff0c;…

好玩粘土特效软件分享!3个很火的软件!

在数字艺术日益发展的今天&#xff0c;粘土特效软件以其独特的魅力和强大的功能&#xff0c;成为众多创意人士和艺术家的得力助手。这些软件不仅能够帮助用户轻松实现粘土动画效果&#xff0c;还能为作品增添生动的质感和细节&#xff0c;让创意无限延伸。那么&#xff0c;究竟…

Kotlin基本特性

目录 函数 if when 循环 面向对象 继承 主构造函数 接口 修饰符 ​编辑数据类 单例类 Lambda编程 集合 lambda用法 常见函数式API 空指针 判空辅助工具 字符串内嵌表达式 函数 fun add1(a:Int,b:Int):Int{return ab }fun add2(a:Int,b:Int):Int ab // 只…

机房IP代理是什么?

网络信息时代&#xff0c;数据已成为了重要资源。而数据信息的爬取&#xff0c;离不开代理IP。那么&#xff0c;机房IP代理究竟是什么&#xff1f; 机房IP代理是指分配给机房中的服务器或网络设备的IP地址&#xff0c;用于提供网络服务和连接到互联网&#xff0c;并作为客户端和…

vscode go语言开发中在任意包运行和调试代码 Example使用方法

一般情况下我们在进行go语言开发的时候我们都需要创建一个main方法和main包才能运行go代码&#xff0c; 针对这个问题&#xff0c;go语言给我们内置了功能强大的testing测试框架&#xff0c; 其中一个很有意思的Example测试就非常的方便使用。 他不管你在什么包&#xff0c;也…

459.重复的子字符串

给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 示例 1: 输入: "abab"输出: True解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba&q…

解决背包问题:组合优化的应用与建模方法

前言 在之前发布的智能解决装箱问题&#xff1a;使用优化算法实现高效包装一文中&#xff0c;我们已经介绍了什么是组合优化问题。这里仅简述&#xff1a; 组合优化是数学优化的一支&#xff0c;专注于从有限集合中选取元素的最优化问题。它涉及将一组对象组合在一起&#xff…

Ansible之Playbook的Template模板和tags标签

文章目录 一、Template模块1、准备template模板文件2、修改主机清单文件3、编写playbook4、执行playbook5、准备测试网页6、访问测试 二、tags模块1、编写脚本2、执行tags"xx01"3、执行tags"xx02" 一、Template模块 Jinja是基于Python的模块引擎。Templat…

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程【18~23】

视频0~17的笔记 页面路由 实现不同页面之间的跳转和数据传递。 页面栈。上限是32个页面&#xff0c;使用router.clear()可以清空页面栈释放内存。 两种跳转模式&#xff1a; 参数一致&#xff0c;都是三个参数 router.pushUrl()&#xff0c;新页面压入页面栈&#xff0c;可以…

GPT-SoVits:语音克隆,语音融合

首发网站 https://tianfeng.space 前言 零样本文本到语音&#xff08;TTS&#xff09;&#xff1a; 输入 5 秒的声音样本&#xff0c;即刻体验文本到语音转换。少样本 TTS&#xff1a; 仅需 1 分钟的训练数据即可微调模型&#xff0c;提升声音相似度和真实感。跨语言支持&…

网易Airtest集群方案大揭秘:小型便携式集群方案来啦

一、前言 中小型企业/工作室搭建便携设备集群的制胜法宝是什么&#xff1f;当然非网易Airtest便携式机柜莫属啦。得益于广大企业客户对我们便携式集群的支持&#xff0c;我们团队也一直在坚持优化小型的便携式集群方案&#xff0c;短短2年时间&#xff0c;我们的便携式机柜已经…

oracle 新_多种块大小的支持9i

oracle 新_多种块大小的支持 conn sys/sys as sysdba SHOW PARAMETER CACHE ALTER SYSTEM SET DB_CACHE_SIZE16M; ALTER SYSTEM SET DB_4K_CACHE_SIZE8M; CREATE TABLESPACE K4 DATAFILE F:\ORACLE\ORADATA\ZL9\K4.DBF SIZE 2M BLOCKSIZE 4K; CREATE TABLE SCOTT.A1 TABLESP…

【csdn】数据工程实践:从网络抓取到API调用,解析共享单车精准投放所需要的数据

共享单车作为一种便捷的出行方式&#xff0c;有效缓解了“最后一公里”难题&#xff0c;同时促进了绿色出行。然而&#xff0c;在高峰时段&#xff0c;供需不均和停车难成为普遍挑战&#xff0c;尤其是在通勤时间&#xff0c;热门地点如地铁站附近和办公区常常面临车辆短缺或停…

【C语言】/*操作符(上)*/

目录 一、算数操作符&#xff1a;、-、*、/、% 1.1 和 - 1.2 * 1.3 / 1.4 % 二、赋值操作符&#xff1a; 和符合赋值 2.1 连续赋值 2.2 复合赋值(自操作) 三、单目操作符&#xff1a;、--、(正号)、-(负号) 3.1 和 -- 3.1.1 前置 3.1.2 后置 3.1.3 前置-- …