46并发编程(线程、进程)

每天五分钟学Linux | 第四十六课:并发编程(线程、进程)

大家好!欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中,我们学习了系统调用和内核API的相关知识。今天,我们将探讨并发编程的基本概念,包括进程和线程,以及如何在Linux系统中管理和使用它们。

并发编程的重要性

并发编程是现代软件开发中不可或缺的一部分,尤其是在多核处理器普及的今天。通过并发编程,可以让程序同时执行多个任务,提高程序的响应速度和资源利用率。

进程与线程的区别
进程

进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的地址空间和其他资源,进程之间相对独立。

  • 特点
    • 每个进程有自己的内存空间。
    • 进程之间的通信需要通过IPC机制(如管道、消息队列等)。
    • 创建和销毁进程的开销较大。
线程

线程是进程中的一个执行单元,也被称为轻量级进程。一个进程中可以有多个线程,它们共享进程的资源,如内存空间、文件句柄等。

  • 特点
    • 线程共享进程的内存空间。
    • 线程之间的切换成本较低。
    • 创建和销毁线程比进程更快捷。
在Linux中使用进程和线程
创建进程

在C语言中,创建一个新进程通常使用fork()函数。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid;pid = fork();if (pid < 0) {fprintf(stderr, "fork failed!\n");return 1;} else if (pid == 0) {// 子进程printf("子进程PID: %d\n", getpid());} else {// 父进程printf("父进程PID: %d, 子进程PID: %d\n", getpid(), pid);wait(NULL); // 等待子进程结束}return 0;
}
创建线程

在C语言中,使用线程通常需要包含<pthread.h>头文件,并使用pthread_create()函数。

#include <stdio.h>
#include <pthread.h>void* thread_function(void* arg) {printf("线程PID: %d\n", getpid());return NULL;
}int main() {pthread_t thread_id;if (pthread_create(&thread_id, NULL, thread_function, NULL) != 0) {printf("创建线程失败\n");return 1;}printf("主线程PID: %d\n", getpid());pthread_join(thread_id, NULL); // 等待线程结束return 0;
}
示例演示

让我们通过一些具体的例子来练习如何在Linux中使用进程和线程:

示例1:创建并使用进程
  1. 编写C程序

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/wait.h>int main() {pid_t pid;pid = fork();if (pid < 0) {fprintf(stderr, "fork failed!\n");return 1;} else if (pid == 0) {// 子进程printf("子进程PID: %d\n", getpid());} else {// 父进程printf("父进程PID: %d, 子进程PID: %d\n", getpid(), pid);wait(NULL); // 等待子进程结束}return 0;
    }
    
  2. 编译并运行程序

    gcc -o process process.c
    ./process
    

    这将创建一个子进程,并分别打印出父进程和子进程的PID。

示例2:创建并使用线程
  1. 编写C程序

    #include <stdio.h>
    #include <pthread.h>void* thread_function(void* arg) {printf("线程PID: %d\n", getpid());return NULL;
    }int main() {pthread_t thread_id;if (pthread_create(&thread_id, NULL, thread_function, NULL) != 0) {printf("创建线程失败\n");return 1;}printf("主线程PID: %d\n", getpid());pthread_join(thread_id, NULL); // 等待线程结束return 0;
    }
    
  2. 编译并运行程序

    gcc -lpthread -o thread thread.c
    ./thread
    

    这将创建一个线程,并分别打印出主线程和新创建的线程的PID。

并发编程的注意事项

在并发编程中,需要注意以下几点:

  • 竞态条件(Race Condition):当多个线程或进程同时访问并修改同一份数据时,可能会导致不可预期的结果。
  • 死锁(Deadlock):当两个或多个线程互相等待对方持有的资源而不释放自己的资源时,会导致死锁。
  • 资源泄漏(Resource Leak):忘记释放资源(如文件句柄、内存等)可能导致资源耗尽。

为了应对这些问题,可以使用同步机制(如互斥锁、信号量等)来保护共享资源,并确保正确的资源管理。

结语

通过今天的课程,你学习了并发编程的基本概念,包括进程和线程的区别以及如何在Linux系统中使用它们。掌握了这些基本技能后,你可以更好地理解和利用Linux系统的能力,为后续的学习和开发工作打下坚实的基础。

如果你有任何问题或需要进一步的帮助,请随时留言。我们下节课将继续带你深入了解Linux的更多知识。再见!


这篇文章旨在帮助读者了解并发编程的基本概念以及如何在Linux中使用进程和线程,并通过具体的示例演示并发编程的基本操作。通过学习这些基本操作,即使是非IT专业的读者也能轻松上手,并为进一步的实战和工作打下坚实的基础。希望这篇文章能够帮助你更好地理解和使用Linux操作系统。

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

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

相关文章

渗透测试---shell(5)字符串运算符与逻辑运算符

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 目录 一、字符串运算符 创建u.sh文…

06、Spring AOP

在我们接下来聊Spring AOP之前我们先了解一下设计模式中的代理模式。 一、代理模式 代理模式是23种设计模式中的一种,它属于结构型设计模式。 对于代理模式的理解: 程序中对象A与对象B无法直接交互,如:有人要找某个公司的老总得先打前台登记传达程序中某个功能需要在原基…

游戏陪玩系统开发功能需求分析

电竞游戏陪玩系统是一种专门为游戏玩家提供陪伴、指导和互动服务的平台。这类系统通常通过专业的陪玩师&#xff08;也称为陪练师&#xff09;为玩家提供一对一或多对一的游戏陪伴服务&#xff0c;帮助玩家提升游戏技能、享受游戏乐趣&#xff0c;甚至解决游戏中的各种问题。电…

【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型&#xff1a; 数据库分为网状数据库&#xff0c;层次数据库&#xff0c;关系型数据库和非关系型数据库四种。 目前市场上比较主流的是&#xff1a;关系型数据库和非关系型数据库。 关系型数据库使用结构化查询语句&#xff08;SQL&#xff09;对关系型数据库进行…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是&#xff1a;请基于附件 1 中的数据以及你的团队收集的额外数据&#xff0c;分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素&#xff0c;预测未来三年中国宠物行业的发展。 第一个问题&#xff1a;分析中国宠物行业按宠物类型的发展…

合法三元数量计算

问题描述 小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题&#xff0c;给定一个长度为n的数组a&#xff0c;他们想要找出符合特定条件的三元组 (i, j, k)。具体来说&#xff0c;三元组要满足 0 < i < j < k < n&#xff0c;并且 max(a[i], a[…

wsl虚拟机中的dockers容器访问不了物理主机

1 首先保证wsl虚拟机能够访问宿主机IP地址&#xff0c;wsl虚拟机通过vEthernet (WSL)的地址访问&#xff0c;着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题&#xff1a;wsl虚拟机中安装了docker&#xff0c;用在用到docker容器内的开发环境&#xff0c;但是虚拟机…

深入了解 Linux htop 命令:功能、用法与示例

文章目录 深入了解 Linux htop 命令&#xff1a;功能、用法与示例什么是 htop&#xff1f;htop 的安装htop的基本功能A区&#xff1a;系统资源使用情况B区&#xff1a;系统概览信息C区&#xff1a;进程列表D区&#xff1a;功能键快捷方式 与 top 的对比常见用法与示例实际场景应…

如何删除Kafka中的数据以及删除topic

如何删除Kafka数据已经以及删除topic呢&#xff1f; 1、删除数据 先启动Kafka实例 docker exec -it kafka-0 /bin/bash #进去容器 rm -rf /bitnami/kafka/data/* #删除数据 exit #退出如果删除失败&#xff0c;可能是数据不存在于/bitnami/kafka/data&#xff0c;使用 cd /o…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…

【2024最新】基于springboot+vue的疫情网课管理系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画

Python Turtle召唤童年&#xff1a;喜羊羊与灰太狼之懒羊羊绘画 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; 小时候&#xff0c;每次打开电视…

SpringBoot学习记录(四)之分页查询

SpringBoot学习记录&#xff08;四&#xff09;之分页查询 一、业务需求1、基本信息2、请求参数3、相应数据 二、传统方式分页三、使用PageHelper分页插件 一、业务需求 根据条件进行员工数据的条件分页查询 1、基本信息 请求路径&#xff1a; /emps 请求方式&#xff1a; …

6. Spring Cloud Gateway网关超详细内容配置解析说明

6. Spring Cloud Gateway网关超详细内容配置解析说明 文章目录 6. Spring Cloud Gateway网关超详细内容配置解析说明前言1 Spring Cloud Gateway 概述1.1 Spring Cloud Gateway网关 的核心功能1.2 Spring Cloud Gateway VS Zuul 的区别1.3 Spring Cloud Gateway 的基本原理1.4 …

远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接

前言&#xff1a;大家好&#xff01;今天我要教你们如何在树莓派5上安装Raspberry Pi OS&#xff0c;并配置SSH和VNC权限。通过这些步骤&#xff0c;你将能够在Windows电脑上使用VNC Viewer&#xff0c;结合Cpolar内网穿透工具&#xff0c;实现长期的公网远程访问管理本地树莓派…

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han

【机器学习】回归模型(线性回归+逻辑回归)原理详解

线性回归 Linear Regression 1 概述 线性回归类似高中的线性规划题目。线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合&#xff08;加减乘除&#xff09;起来&#xff0c;得到的结果和目标接近。 线性回归分为一元线性回归和多元线性回归。 2 一元线…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力&#xff0c;远远超过了经典计算机的能力。当与人工智能&#xff08;AI&#xff09;集成时&#xff0c;量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题&#xff0c;这对优化和…