【Linux】多线程相关问题
判断题
-
不论是系统支持线程还是用户级线程,其切换都需要内核的支持(F)
用户态线程的切换在用户态实现,不需要内核支持。 -
线程包含CPU现场,可以独立执行程序(F)
线程包含cpu现场,但是线程只是进程中的一个执行流,执行的是程序中的一个片段的代码,多个线程共同完成整体程序的运行。 -
线程和进程都可并发执行,线程的粒度小于进程,占用资源更少,因此通常多线程比多进程并发性更高(T)
-
ps命令用于查看进程信息,其中-L选项用于查看轻量级进程信息(T)
-
pthread_self() 用于获取轻量级进程ID(F)
pthread_self() 用于获取用户态线程的tid。 -
在有多个线程的情况下,主线程从main函数的return返回或者调用pthread_exit函数,则整个进程退出(F)
主线程调用pthread_exit只是退出主线程,并不会导致进程的退出。 -
在linux 中,进程比线程安全的原因是进程之间不会共享数据(F)
进程比线程安全的原因是每个进程有独立的虚拟地址空间,有自己独有的数据,具有独立性。不会数据共享这个太过宽泛与片面。 -
对于大量的计算优先使用多进程(F)
大量的计算使用多进程和多线程都可以实现并行/并发处理,多线程的资源消耗小于多进程,但稳定性较多进程有所不如,因此还要看具体更加细致的需求场景。 -
一个程序至少有一个进程,一个进程至少有一个线程(F)
程序是静态的,不涉及进程,进程是程序运行时的实体,是一次程序的运行。 -
线程自己不拥有系统资源(T)
进程是资源的分配单位,所以线程并不拥有系统资源,而是共享使用进程的资源,进程的资源由系统进行分配。 -
条件变量和信号量可用来实现线程间通知和唤醒(T)
线程间的通知和唤醒以及线程的等待,这些是线程间实现同步的基础,而信号量和条件变量通过提供使线程等待和唤醒的功能,而被用于实现线程间的同步。 -
在生产者与消费者模型中只需要一个条件变量就可以(F)
条件变量使用时,不同的角色需要等待在不同的条件变量等待队列中,防止角色被误唤醒。 -
银行家算法可以预防死锁(F)
银行家算法的思想在于将系统运行分为两种状态:安全/非安全(有可能出现风险的都属于非安全)。
银行家算法,在分配资源前进行风险判断,避免风险的发生。是避免出现死锁的一种算法(并非预防的方法)。主要是避免了出现“环路等待”的条件。 -
信号量允许多个线程同时使用共享资源(T)
信号量主要用于实现同步操作,只要信号量资源数大于0就表示可获取,可访问。
若要使用信号量模拟实现互斥,则需要初始化资源计数为1,表示资源只有一个,则只有一个执行流能访问。 -
如果只是在进程内部使用的话,使用临界区会带来速度上的优势并能够减少资源占用量(T)
临界区技术:实现串行化来访问共享资源的代码片段。速度比较快但是只能用于同一进程的线程间。
问答题
-
请简述什么是LWP?
LWP是轻量级进程,在Linux下进程是资源分配的基本单位,线程是cpu调度的基本单位,而线程使用进程pcb描述实现,并且同一个进程中的所有pcb共用同一个虚拟地址空间,因此相较于传统进程更加的轻量化。 -
请简述LWP与pthread_create创建的线程之间的关系?
pthread_create是一个库函数,功能是在用户态创建一个用户线程,而这个线程的运行调度是基于一个轻量级进程实现的。 -
简述轻量级进程ID与进程ID之间的区别?
因为Linux下的轻量级进程是一个pcb,每个轻量级进程都有一个自己的轻量级进程ID(pcb中的pid),而同一个程序中的轻量级进程组成线程组,拥有一个共同的线程组ID。 -
请简述什么是线程互斥,为什么需要互斥?
线程互斥指的是,在多个线程对临界资源进行争抢访问时有可能会造成数据二义,因此需要通过保证同一时间只有一个线程能够访问临界资源的方式,来实现线程对临界资源的访问安全性。 -
请简述什么是线程同步,为什么需要同步?
线程同步指的是线程间对数据资源进行获取,有可能在不满足访问资源条件的情况下就访问资源,而造成程序逻辑混乱。因此通过进行条件判断来决定线程在不满足条件时休眠等待或满足条件后唤醒的方式实现对资源访问的合理性。 -
请简述线程安全概念与实现?
线程安全指的是在多线程编程中,多个线程对临界资源进行争抢访问而不会造成数据二义或程序逻辑混乱的情况。
线程安全的实现,通过同步与互斥实现。 -
信号量与条件变量有什么区别?
条件变量:提供了一个pcb阻塞队列以及阻塞和唤醒线程的接口用于实现同步,但是什么时候该唤醒以及什么时候该阻塞线程由程序员进行控制,而这个控制通常需要一个共享资源的条件判断完成,因此条件变量还需要搭配互斥锁使用,来保护这个共享资源的条件判断及操作。
信号量:提供一个pcb等待队列,以及一个实现了原子操作的对资源进行计数的计数器,通过自身计数器实现同步的条件判断,因此不需要搭配互斥锁使用,而且信号量在初始化计数为1的情况下也可以模拟实现互斥操作。 -
请简述线程池的作用与实现原理?
线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现,线程池中的线程可以从阻塞队列中获取任务进行任务处理,当线程都处于繁忙状态时可以将任务加入阻塞队列中,等到其中的线程空闲后进行处理。
线程池可以避免大量线程频繁创建或销毁所带来的时间成本,也可以避免在峰值压力下,系统资源耗尽的风险;并且可以统一对线程池中的线程进行管理,调度,监控。 -
如何理解原语的原子性,在单机环境下如何实现原语的原子性,实现时应注意哪些问题?
所谓原语的原子性操作是指一个操作中的所有动作,要么成功完成,要么全不做。也就是说,原语操作是一个不可分割的整体。为了保证原语操作的正确性,必须保证原语具有原子性。在单机环境下,操作的原子性一般是通过关闭中断来实现的。由于中断是计算机与外设通信的重要手段,关闭中断会对系统产生很大的影响,所以在实现时一定要避免原语操作花费时间过长,绝对不允许原语中出现死循环。
程序题
完成两个线程通过条件变量实现交替打印的控制
要求:线程A打印-我是线程A;线程B打印-我是线程B; 最终实现交替打印,不能出现连续的相同打印。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>// 互斥锁
pthread_mutex_t g_lock;// 同步
pthread_cond_t thread_a_cond;
pthread_cond_t thread_b_cond;int g_is_my_turn = 0;void *thread_a_start(void *arg)
{(void)arg;while (1){pthread_mutex_lock(&g_lock);while (g_is_my_turn == 1){pthread_cond_wait(&thread_a_cond, &g_lock);}printf("线程A打印-我是线程A\n");g_is_my_turn++;pthread_mutex_unlock(&g_lock);pthread_cond_signal(&thread_b_cond);}
}void *thread_b_start(void *arg)
{(void)arg;while (1){sleep(1);pthread_mutex_lock(&g_lock);while (g_is_my_turn == 0){pthread_cond_wait(&thread_b_cond, &g_lock);}printf("线程B打印-我是线程B\n");g_is_my_turn--;pthread_mutex_unlock(&g_lock);pthread_cond_signal(&thread_a_cond);}
}int main()
{pthread_mutex_init(&g_lock, nullptr);pthread_cond_init(&thread_a_cond, nullptr);pthread_cond_init(&thread_b_cond, nullptr);pthread_t thread_a, thread_b;int ret = pthread_create(&thread_a, nullptr, thread_a_start, nullptr);if (ret < 0){perror("pthread_create");return 0;}ret = pthread_create(&thread_b, nullptr, thread_b_start, nullptr);if (ret < 0){perror("pthread_create");return 0;}pthread_join(thread_a, nullptr);pthread_join(thread_b, nullptr);pthread_mutex_destroy(&g_lock);pthread_cond_destroy(&thread_a_cond);pthread_cond_destroy(&thread_b_cond);return 0;
}
相关文章:
【Linux】多线程相关问题
判断题 不论是系统支持线程还是用户级线程,其切换都需要内核的支持(F) 用户态线程的切换在用户态实现,不需要内核支持。 线程包含CPU现场,可以独立执行程序(F) 线程包含cpu现场,但是…...
GPS北斗卫星时空信号安全防护装置(授时)介绍
GPS北斗卫星时空信号安全防护装置(授时)介绍 GPS北斗卫星时空信号安全防护装置(授时)介绍 当前,我国电力系统普遍采用北斗卫星或者GPS卫星授时来实现时间同步,但不加防护的授时装置存在卫星信号被干扰或欺…...
redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板
redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象,引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致这个数据的每次请求都需要查DB,数据库压力…...
智慧公交:提高城市出行效率的数字化之路
随着城市化进程的不断加速,公共交通成为人们日常出行的主要方式之一。为了提高公共交通的效率和服务质量,智慧公交应运而生。智慧公交是一种基于物联网、大数据、人工智能等技术,对公共交通进行数字化、智能化改造的新型公共交通系统。 以此为…...
Linux - 内存 - memblock 分配器
说明 memblock是Linux内核启动早期用于管理物理内存的机制,在伙伴系统(Buddy System)接管内存管理之前为系统提供物理内存分配、释放等功能。相对于伙伴系统,memblock功能和实现较为简单。本文基于:linux_5.10 arm64平…...
SQL、Jdbc、JdbcTemplate、Mybatics
数据库:查询(show、select)、创建(create)、使用(use)、删除(drop)数据库 表:创建(【字段】约束、数据类型)、查询、修改(alter *add)、删除 DML:增加(inse…...
四六级高频词组8
目录 词组 其他链接 词组 301. in fashion(stylish, most modern)时兴,流行 302. after the fashion (of) 依照… 303. find fault with(complain about;criticize)找…...
fastapi-amis-admin快速创建一个后台管理系统增加音乐管理功能(3)
感觉为了实现maui的效果。准备了一个后端及restful项目 ,如同想吃鱼就健个鲁塘一下,但还是写一下吧。 fastapi_amis_admin 是一个功能强大的框架,旨在帮助开发者在使用 FastAPI 进行 web 开发时,能够快速创建一个高效且易于管理的…...
全球化需要先搬离中国?中国公司出海不应失去“模式自信”
中国企业出海近期热闹非凡,其中以短剧为代表的文化内容产业和跨境电商产业都吸引了大量关注。例如亚马逊在12月12日公布一组最新数据,亚马逊过去一年销售额超过1000万美金的中国卖家数量,同比增长接近30%。中国跨境电商平台在刚刚过去的“黑五…...
三大维度解码剑南春“高质量发展”丨年度盘点
执笔 | 洪大大 编辑 | 扬 灵 2023年即将画上句点,当我们回首这一年为行业带来惊喜的品牌,剑南春是其中之一。 回顾剑南春今年一整年的动作,从新品频发到双节(618、双11)热销,从全国巡展到荣誉满载&…...
外包干了3个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...
思福迪运维安全管理系统 test_qrcode_b RCE漏洞复现
0x01 产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机。 0x02 漏洞概述 由于思福迪运维安全管理系统 test_qrcode_b路由存在命令执行漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限&#…...
Salesforce×阿里云,影响几何?
实际上,从这个视角来看,Salesforce和阿里云的合作也恰在成为着这个市场的一个新催化剂。“期待Salesforce能给中国市场带来一些新的增量,包括对合作伙伴的态度,对产品的态度等等。”一位CRM相关人士告诉我们。 那么,阿…...
Qt对excel操作
Qt库中自带对excel操作的模块QAxObject,QAxObject是Qt提供给程序员从代码中访问Office的对象类,其本质上是一个面向微软操作系统的COM接口。 QAxObject将所有Office的工作簿、表格、文档等都作为其子对象,程序员通过调用querySubObject()这个…...
每日一练 | 华为认证真题练习Day148
1、关于RSTP协议提供的保护功能说法正确的有?(多选) A. Root保护功能只能在指定端口上配置生效 B. 环路保护功能只能在根端口或Alternate端口上配置生效 C. 启用防TC— BPDU报文攻击功能后,可以避免频繁的删除HAC地址表项 D. 交换设备上…...
ES6学习(二):解构赋值
前言 解构赋值是ES6中新提出的语法,简单并且实用,数组和对象都可以使用 数组解构赋值 规则 1.其实是按照顺序一一匹配的,就像排队领取物资一样,你领到什么就是什么,没有挑的份,你排的晚了什么都没领到,那就是undifined。 2.如果给分配的是一个数组,那可以在命名时外部嵌套…...
kubebuilder开发operator
安装kubebuilder前 需要有kubernetes环境和golang环境 官网:https://go.kubebuilder.io/ 安装kubebuilder #下载 wget https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) #改名kubebuilder后加权限 chmod x kubebuilder #放到环境变量里 mv k…...
docker中启动ES报错:AccessDeniedException: /usr/share/elasticsearch/data/nodes
一、K8S部署的elasticsearch 6.8版本 数据持久化到本地磁盘 今天做elasticsearch数据迁移,直接 SCP拷贝至另外一台服务器 原服务器处理好后拷贝回来,然后启动elasticsearch报错 {"type": "server", "timestamp": "2…...
java集成Nacos服务
1,添加依赖:首先,在你的 Java 项目中,你需要添加 Nacos 客户端 SDK 的依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</ve…...
开源IPad Pro应用IDE:使用SSH远程连接服务器进行云端编程开发
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
