《程序员的自我修养--链接,装载与库》

第一章:温故而知新

过度优化的问题:

我们知道volatile关键字可以阻止过度优化,因为它可以完成两件事:

  • 阻止编译器为了提高速度将一个变量缓存到寄存器而不写回
  • 阻止编译器调整操作volatile变量的指令顺序

然而,在优化这一块,不仅编译器会做优化,CPU也会做优化。volatile就管不着了CPU了。
经典的例子当然是单例模式。单例模式有一种常规的解决方案是DCL,也就是双重检查锁,但是在C++中new的步骤有是分为三个步骤:分配内存,调用构造函数,将内存地址用指针保存下来。CPU就要来搞怪,将第二步第三步乱个序。
一种解决方案是:调用CPU提供的barrier指令阻止将barrier指令之前的代码交换到barrier之后。但是这种方案不具有可移植性。部分实现代码如下:

if(!pInst){lock();if(!pInst){T* temp = new T;barrier();pInst = temp;}unlock();
}

线程:

是程序执行流的最小单元。通常意义上,一个进程由多个线程组成,各个线程之间共享程序的内部空间(包括代码段,数据段,堆等)及一些进程级的资源(如打开文件和信号)

线程的访问权限:

线程调度与优先级

  • 运行(Running):此时线程正在执行
  • 就绪(Ready):此时线程可以立刻运行,但CPU已经被占用
  • 等待(Waiting):此时线程正在等待某一件事件发生,无法执行

可抢占线程和不可抢占线程

线程在用尽时间片之后会被强制剥夺继续执行的权利,而进入就绪状态,这个过程叫做抢占,即之后执行的别的线程抢占了当前线程。

在早期的一些系统中,线程是不可抢占的。线程必须手动发出一个放弃执行的命令,才能让其他的线程得到执行。可以避免一些因为抢占式线程里调度时机不确定而产生的问题。非抢占式线程已经十分少见

参考文章:《程序员的自我修养》笔记_程序员的自我修养 写时复制-CSDN博客

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

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

相关文章

【开源】基于JAVA的中小学教师课程排课系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 角色管理模块2.2 课程档案模块2.3 排课位置模块2.4 排课申请模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 课程表3.2.3 排课位置表3.2.4 排课申请表 四、系统展示五、核心代码5.1 查询课程5.2 新增课…

【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic

【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic 原因 golang 服务出现了 panic,根据 panic 打印出的堆栈找到了问题代码,看上去原因是:json 序列化时,遇到了无法序列化的内容 [panic]: json: unsupported …

转后端一年半双非本科Java无实习进大厂,给双非朋友经验分享

背景介绍 B站有详细视频,同名搜索即可。 今天文章想分享的是我踩过的坑以及那些做的是值得大家参考。 有需要就加V: zhazhagao_ 进了快手(如果你觉得不是大厂那就不是!): 真双非本科: 安徽某双非无实习: 因为编程语言问题,去过之后发现不喜欢…

Spark 运行架构

Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。 如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master, 负责管理整个集群中的作业任务调度。图形中的 Executor 则是 sla…

netcore html to pdf

一、新建项目&#xff1a;QuestPDFDemo <PackageReference Include"NReco.PdfGenerator" Version"1.2.1" /> 二、上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging;using QuestPDFDemo.Models; using System; using Sys…

WEB 3D技术 three.js 包围盒

本文 我们来说 包围盒 如下图所示 就是一个方框 框住我们整个物体 它的作用 比较明显的就是 当用户点击某个物体 我们用包围盒套住 用户能够很直观的知道自己当前选中的物体是哪一个 还有就是 比如 我们物体做的比较复杂 是非常多顶点构建的 那么 我们判断它有没有和其他物体…

第14课 用openCV数豆豆

除了检测运动&#xff0c;openCV还能做许多有趣且实用的事情。其实openCV和FFmpeg一样都是宝藏开源项目&#xff0c;貌似简单的几行代码功能实现背后其实是复杂的算法在支撑。有志于深入学习的同学可以在入门后进一步研究算法的实现&#xff0c;一定会受益匪浅。 这节课&#…

Flutter3.X基础入门教程(2024完整版)

Flutter介绍&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前Flutter已经支持 iOS、Android、Web、Windows、macOS、Linux的跨平台开发。 教程所讲内容支持…

软件测试|什么是Python构造方法,构造方法如何使用?

构造方法&#xff08;Constructor&#xff09;是面向对象编程中的重要概念&#xff0c;它在创建对象时用于初始化对象的实例变量。在Python中&#xff0c;构造方法是通过特殊的名称__init__()来定义的。本文将介绍Python构造方法的基本概念、语法和用法。 什么是构造方法&…

C++面试宝典第14题:结构体和位域对齐

题目 阅读下面的代码段,并给出程序的输出(使用Visual Studio 2019编译器)。 #include <stdio.h> #include <string.h>struct TData {int a:3;int b:3;int c:3;int d:6;double e;short f; };int main() {printf("%d\n", (int)sizeof(TData));TData da…

软件测试|Windows系统安装Cypress教程

前言 每当提起web自动化测试&#xff0c;大家首先想到的就是selenium&#xff0c;最近这两年时间&#xff0c;出现了playwright和cypress这两款新的工具&#xff0c;不过现在应用范围还是不如selenium&#xff0c;之前我们介绍了playwright的使用&#xff0c;现在开始&#xf…

生态系统服务构建生态安全格局中的实践技术应用

生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为&#xff1a;一&#xff0c;保持生态系统活力和内外部组分、结构的稳定与持续性&#xff1b;二&#xff0c;维持生态系统生态功能的完整性&#xff1b;三&#xff0c;面临外来不利因素时&#xff0c;生态系统具…