【23】线程相关扩展习题

C++23实战:用现代C++重构高性能游戏引擎渲染模块 STL容器性能瓶颈在高性能游戏开发中,性能优化是至关重要的。特别是在粒子系统等高频调用的模块中,如何优化数据结构的内存访问效率,直接影响着游戏的整体性能。传统的虽然方便,但在内存管理上可能导致频繁的内存重分配和碎片化,影响性能。通过结合C++23的新特性(如模块化、协程优化),并深入探讨如何通过优化STL容器和自定义内存池提高渲染性能,我们成功地在高性能游戏引擎中实现了粒子系统的优化。此外,Vulkan API的深度集成和精细的内存同步控制,解决了多线程渲染中的资源冲突问题。 阅读详情

目录

习题一

习题二

习题三


习题一

/**
 * 银行有一个账户
 * 有两个储户分别向同一个账户存3000元,每次存1000,存三次,每次存完打印账户余额
 *
 * 分析:
 * 1、两个储户线程
 * 2、是否有共享数据:账户,余额
 * 3、是否有线程安全问题
 * 4、需要考虑线程安全问题:同步机制:三种方式
 *
*/
class Account{
    private double balance;
    private ReentrantLock lock = new ReentrantLock();

    public Account(double balance){
        this.balance=balance;
    }
    //    存钱的方法一
//    public synchronized void deposit(double amt){
    public void deposit(double amt){
//        方法二
        lock.lock();
        try {
            if (amt > 0) {
                balance += amt;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "存钱成功,余额:" + balance);
            }
        }finally {
            lock.unlock();
        }
    }
}
class Customer extends Thread{
    private Account acc;

    public Customer(Account acc){
        this.acc=acc;
    }

    @Override
    public void run() {
        for (int i=0;i<3;i++){
            acc.deposit(1000);
        }
    }
}
public class AccounTest {

    public static void main(String[] args) {
        Account acc=new Account(0);

        Customer c1=new Customer(acc);
        Customer c2=new Customer(acc);
        c1.setName("甲");
        c2.setName("乙");
        c1.start();
        c2.start();
    }
}

习题二

/**
 * 线程通信的例子:使用两个线程打印1-100,线程1、2交替打印
 * 涉及到的三个方法:
 * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
 * notify():一旦执行此方法,就会唤醒被wait()的一个进程,如果有多个线程被wait,就唤醒优先级最高的
 * notifyAll():一旦执行此方法,就会唤醒所有被wait的线程。
 *
 * 说明:
 * 1、wait(),notify(),notifyAll()三个方法必须使用在同步代码块中或同步方法中
 * 2、wait(),notify(),notifyAll()三个方法调用者必须是同步代码块或同步方法中的同步监视器,
 *      否则,会出现IllegaLmontiorStateException异常
 * 3、wait(),notify(),notifyAll()三个方法是定义在java.long.Object类中。
 *
 * 面试题:sleep()和wait()的异同
 * 1、相同点:一旦执行方法,都可以使得当前线程进入堵塞状态
 * 2、不同点:(1)两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait()
 *          (2)调用的要求不同,sleep()可以在任何需要的场景下调用。wait()必须使用子啊同步代码块中或同步方法中
 *          (3)关于是否释放同步监视器,如果两个方法都是用在同步代码块或同步方法中中,sleep()不会释放锁,wait()会释放锁
 *
*/
class Number implements Runnable{
    private int num=1;
    private ReentrantLock lock =new ReentrantLock();

    @Override
    public void run() {

        while (true){
//            lock.lock();
//            try {
            synchronized (this) {
                notify();
                if (num <= 100) {
                    System.out.println(Thread.currentThread().getName() + ":" + num);
                    num++;

                    try {
//                        使得调用如下wait()方法的进程进入堵塞状态
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}


public class CommunicationTest {
    public static void main(String[] args) {
        Number number=new Number();
        Thread t1=new Thread(number);
        Thread t2=new Thread(number);
        t1.setName("线程一");
        t2.setName("线程二");
        t1.start();
        t2.start();
    }

}

习题三

/**
 * 线程通信的应用:经典例题:生产者/消费者问题
 *
 * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处
 * 取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图
 * 生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通
 * 知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如
 * 果店中有产品了再通知消费者来取走产品。
 *
 * 分析:
 * 1、是否是多线程:生产者,消费者
 * 2、是否有共享数据:店员/产品
 * 3、如何来来解决线程的安全问题:同步机制,有三种方法
 * 4、是否涉及到线程的通信:
 *
 *
*/
class Clerk{
    private int productCont=0;
//        生产
//    synchronized不要忘了加
    public synchronized void produceProduct() {
        if(productCont<20){
            productCont++;
            System.out.println(Thread.currentThread().getName()+":开始生产第"+productCont+"个产品");
            notify();
        }else {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
//        消费
    public synchronized void consumeProduct()  {
        if(productCont>0){
            System.out.println(Thread.currentThread().getName()+":开始消费第"+productCont+"个产品");
            productCont--;
            notify();
        }else {
            try {
                wait();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//生产者
class Producer extends Thread{
    private Clerk clerk;

    public Producer(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public synchronized void run() {
        System.out.println(Thread.currentThread().getName()+"开始生产产品");
        while(true){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.produceProduct();
        }
    }
}
//消费者
class Consumers extends Thread{
    private Clerk clerk;

    public Consumers(Clerk clerk){
        this.clerk=clerk;
    }

    @Override
    public synchronized void run() {
        System.out.println(Thread.currentThread().getName()+":消费产品");
        while(true){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            clerk.consumeProduct();
        }
    }
}
public class ProductTest {
    public static void main(String[] args) {
        Clerk clerk=new Clerk();
        Producer p1=new Producer(clerk);
        p1.setName("生产者");

        Consumers p2=new Consumers(clerk);
        p2.setName("消费者");

        p1.start();
        p2.start();
    }
}

 

多线程相关面试题 1、什么是进程?什么是线程? 进程是操作系统分配资源的最小单元 线程是操作系统调度的最小单元。 一个程序至少有一个进程,一个进程至少有一个线程。 2、JVM、JRE、JDK的关系? JVM:(Java Virtual Machine),Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操 作系统上的函数,完成我们想要的操作。 3、JVM中可以运行多种语言吗? 图灵学院JVM只识别字节码,所以JVM其实跟语言是解耦的,也就是没有直接关联。 阅读详情

相关推荐

TransmittableThreadLocal 使用详解、使用 TransmittableThreadLocal 解决在多线程环境下,线程切换时无法传递变量值的问题

TransmittableThreadLocal是什么,TransmittableThreadLocal 和 ThreadLocal 的区别,TransmittableThreadLocal依赖文件、TransmittableThreadLocal的使用,TransmittableThreadLocal使用注意的点、线程之间值传递有哪些方式、TransmittableThreadLocal实现原理

川子的博客 6006

17.java基础-----多线程编程2扩展

1、编码:使用两个线程,分别打印1~100之间的奇数、偶数(实现奇数和偶数的交替打印) public class PrintNumber { //打印数值 public synchronized static void printNumber(int num){ //静态方法的同步锁:类名.class try { PrintNumber.class.notify();//唤醒当前对象锁下的任意一个线程 System.out.

weixin_44140163的博客 5039

x264 中多线程相关编码参数详细介绍

x264 中多线程相关编码参数详细介绍

世界那么大,我想去看看~【随心更新,看世界去了😄】 836

多线程及相关面试题与拓展

首先,抛出几个面试题,相信看完介绍就会明白怎么解答了。 你理解的多线程? iOS的多线程方案有哪几种?你更倾向于哪一种? GCD 的队列类型 线程安全的处理手段有哪些? OC你了解的锁有哪些? ios中常见的多线程方案 我们这里主要讲解GCD GCD中有两个常用的函数,分别为同步和异步 // 同步 dispatch_sync(dispatch_queue_t queue, d...

hengsf123456的博客 215

PaddleOCR GPU部署:从环境配置到避坑实战指南

本文详细介绍了PaddleOCR GPU部署的全过程,从环境配置到避坑实战指南。通过分析常见的部署失败原因,提供硬件兼容性自查、软件环境精配方案以及路径配置的解决方案,帮助用户高效完成GPU加速的OCR任务部署,避免90%的常见错误。

weixin_30839881的博客 419

别再手动算重量了!用C++给UG/NX写个自动计算零件质量与质心的插件(附完整源码)

本文详细介绍了如何使用C++为UG/NX开发智能质量分析插件,实现零件质量与质心的自动计算。通过结合NXOpen和UF_MODL API,设计高效的数据结构和批量处理机制,大幅提升机械设计效率。文章包含完整源码和实用技巧,帮助工程师告别手动计算,适用于复杂装配体的自动化工程计算。

weixin_30247307的博客 133

C++23:关键特性与最新进展深度解析

同时,C++23还对字符串字面量的处理进行了改进,支持更灵活的原始字符串字面量语法,减少了因转义字符而带来的错误和复杂性。此外,C++23还增强了元组与范围的兼容性,使得元组可以更自然地与其他标准库组件结合使用,提升了数据处理和算法实现的效率。同时,C++23还改进了范围的性能和与其他标准库功能的协同性,使得范围在数据处理和算法实现中更加高效和自然。的改进以及栈踪迹的格式化,C++23不仅提升了语言的表达力和灵活性,还为性能优化和调试支持提供了强大的工具。通过范围、元组、字符与字符串转义表示的改进,以及。

码事漫谈 904

ADI恒流驱动芯片LT3763调试心得(25A恒流驱动)

看似很简单的一个电路,调了好几版硬件,中间还出现过一个插曲,就是电感,我用的是27A,1.5uH的,贴片封装,由于频繁试板,电感来回用热风枪拆了3次,结果上电空载到3A都没有问题,但是以上10A以上,就出现烧LT3763和mos的情况,一连烧了8片,搞得有点怀疑人生,一度觉得我的电路设计有问题,邮件咨询ADI的FAE后,确认电路设计没有问题。1、大功率同步整流的Nmos管都是取不同的型号,就是厂家推荐的主开关管和续流管的型号往往都不一样,这个里面有什么讲究,我没有整明白,暂时也不需要弄明白。

liming98lm的博客 3922

线程的相关概念,线程与进程的区别,如何进行多线程编程以及如何使用互斥锁

线程的概念,线程与进程的联系,多线程编程和互斥锁的使用。

yohe12的博客 426

SimpleITK图像基础(一)——3D Resampling

文章目录前言基于SimpleITK进行实现 前言 进入深度学习网络之前需要进行统一数据集,这个时候需要对这些数据集进行重新采样,即假设各向同性体素并重新定向它们,以便可以读取所有图像的像素矩阵。 在将方位变换成一致时,可以用DICOMOrientImageFilter过滤器,可以将 DesiredCoordinateOrientation设置为你想要变换的方位,它将计算出所需的置换顺序并根据需要执行翻转以接近所需方向。 基于SimpleITK进行实现 workflow如下: step 1:首先运行DICOM

YYY_77的博客 2021

解决Thingsboard数据下发难题:自定义RPC请求格式的3种方法(含源码修改指南)

本文详细介绍了解决Thingsboard数据下发难题的3种自定义RPC请求格式方法,包括规则链脚本转换、TB-Gateway中间层转换和源码级定制方案。通过实际案例和性能对比,帮助开发者根据项目需求选择最适合的解决方案,提升物联网平台与设备的兼容性。

weixin_29008691的博客 233

C++23标准之重要特性及用法实例(二百八十五)

本篇目的:C++23之重要特性及用法实例C++23,作为C++编程语言的最新标准,预计将在2023年发布。C++23继续延续了C++标准的演进方向,旨在提供更多的语言特性和标准库改进,以增强程序的性能、安全性和易用性。以下是C++23的一些主要特性和预期改进:模块的进一步改进:C++23预计会对模块系统进行进一步的完善,包括改进模块接口的语法和语义,以及提高模块化代码的编译效率。概念特化的改进:C++23可能会对概念进行扩展,允许对模板参数进行更精细的约束,从而提供更强大的模板元编程能力。

Android系统攻城狮 1852

2022年全国职业院校技能大赛 高职组大数据技术与应用卷⑦——解析答案

大数据时代,电商经营模式发生很大改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。商家可以对客户的消费行为信息数据进行收集和整理,比如消费者购买产品的花费、选择产品的渠道、偏好产品的类型、产品回购周期、购买产品的目的、消费者家庭背景、工作和生活环境、个人消费观和价值观等。通过数据追踪,知道顾客从哪儿来,是看了某网站投放的广告还是通过朋友推荐链接,是新访客还是

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 472

java学习--day23(线程)

新建两个线程:一个是等待线程线程里面的代码从上往下执行的,但是使用object.wait(),就这个方法一用,你的线程就阻塞了,就处于等待状态。意味着当前的代码到了wait方法以后的代码暂时不执行了另外一个是唤醒线程。唤醒线程中使用object.notify()方法,这个方法是专门唤醒刚才那个等待线程。让等待线程继续执行。

weimingchao的博客 119

弹窗提示报错: F:\c\CFX5\bin\Debug\net9.0-windows10.0.26100.0\CFX5.dll 面向无法动态枚举工具箱项目的平台...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 949

ATT MTU 交换机制:提升 BLE 数据传输效率的关键

在低功耗蓝牙(BLE)技术的面试中,ATT MTU 交换机制始终是高频考点。无论是芯片厂商的固件开发岗,还是物联网设备的协议栈调试岗,面试官都爱通过这个知识点考察候选人对 BLE 数据传输底层逻辑的理解。本文将系统梳理核心考点,结合历年真题详解应答思路,轻松应对这类问题。​

byte轻骑兵的技术小窝 2411

[Effective C++]条款22-23 封装性相关

封装的本质在于隐藏内部实现和暴露有限接口, 至于我们为什么推崇封装, 是因为它使我们能改变的事务只影响有限客户, 就是说大大降低了我们后期做出改变时的维护成本.

tianmu_sama的博客 680

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

BS::thread_pool原生扩展详解:跨平台线程控制与性能调优

BS::thread_pool是一款轻量级、高性能的C++17/C++20/C++23线程池库,通过原生扩展提供了强大的跨平台线程控制能力,帮助开发者实现更精细的线程管理和性能优化。本文将深入解析其原生扩展功能,包括线程优先级设置、CPU亲和性控制、线程命名等核心特性,并提供实用的性能调优指南。 ## 🌟 原生扩展核心功能概览 原生扩展是BS::thread_pool的高级特性,通过操作系统

gitblog_00685的博客 954

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++23 中 constexpr 的重要改动

改动内容提案编号说明constexpr 函数中使用非字面量变量、标号和 gotoP2242R3放宽了constexpr函数的使用限制,允许使用非字面量变量、标号和goto语句,只要在编译时不被求值即可,GCC 12 和 Clang 15 开始支持允许 constexpr 函数中的常量表达式中使用 static 和 thread_local 变量P2647R1打破了constexpr函数常量表达式中对static和变量的限制,之前static。

码事漫谈 1174

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

23种设计模式详解

目标: 基本掌握23种设计模式的基本概念并能够写出相应的例子 内容: 学习内容 1.设计模式的概念解释 2.画出设计模式的类图 3.举例说明 计划: 推荐: 1、 每天一个设计模式的学习 2、 隔一天就进行一个模式的复习 3、 顺利敲出相关设计模式的案例 设计模式 重点:设计模式是一种思想,它的形式是多变的,主要掌握他的设计思想 设计模式的七个原则:单一职责、接口隔离、依赖倒转、开闭原则、里式替换、迪米特法则、合成复用原则。 设计模式分为三种类型,共23种 * 创建型模式:单例模式、抽象工厂模式

a_ittle_pan的博客 1453

23种设计模式

public static void send(User user, String msg) { /* 转发消息 */ }System.out.println(type + "子弹发射到(" + x + "," + y + ")");public void deliver() { System.out.println("陆运");System.out.println("书的价格:" + book.getPrice());System.out.println("微信支付:" + amount + "元");

qq_59463944的博客 9940

【无标题】C++23新特性:支持打印volatile指针

在C++开发中,volatile关键字常用于修饰变量,以确保编译器不会对这些变量进行优化,从而保证程序能够正确地与硬件交互或处理多线程环境下的特殊变量。然而,在之前的C++标准中,直接打印volatile指针(如)一直是不被支持的,这给调试工作带来了一定的不便。C++23通过P1147R1提案,为添加了对的支持,使得打印volatile指针成为可能。本文将详细介绍这一新特性的背景、实现方式以及如何在实际开发中使用它。C++23通过P1147R1提案,为添加了对的支持,使得打印volatile指针成为可能。

码事漫谈 948

【27】23种设计模式

这次来讲一下23种设计模式,这是老生常谈的话了,实际运用中,能熟练并且完全掌握的设计模式,大家估计都寥寥无几。首先需要明白一点,你认为的设计模式的作用是什么?不是别人认为的,百度认为的。我认为的设计模式,是为了提供给我们更好的在开发设计中,让功能具有可扩展性,灵活性,可复用性的方法。也许在不断地了解这些模式之后,会对这个认识不断优化,得出你最终认为的价值。如果按照以往方式去讲设计模式,估计就不用讲了,我认为菜鸟教程已经把23种设计模式讲的很明白,大家也可以直接去看教程。

mr_zengkun的博客 1380

JDK23如约而至,数十种新玩法,你期待哪一种?

9 月 17 日,JDK23 它来了。JDK23 并非长期支持版,下一个长期支持版是 JDK25,预计明年 9 月份发布。和松哥一起来看下这次的 JDK23 都有哪些新特性~

江南一点雨的专栏 1391

java多线程并发之旅-23-Executor 框架, ExecutorService, AbstractExecutorService 详解

Q 是什么 为什么需要 有什么优缺点 如何使用 整个技术体系 为什么这么设计?如果是我,我怎么设计? 为什么需要 Executor new Thread() 的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。 不利于扩展,比如如定时执行、定期执行、线程中断 ...

1万+
上一篇: 【Day22】解决线程安全问题以及JDK1.5新增
下一篇: 【Day24】常用类
「已注销」
博客等级 码龄4年 169粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

老板大气,I am happy

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值