- 博客(362)
- 收藏
- 关注
原创 C++ 并发编程指南(11)原子操作 | 11.5、内存模型
C++ 11标准中最重要的特性之一,是大多数程序员都不会关注的东西。它并不是新的语法特性,也不是新的类库功能,而是新的多线程感知内存模型。本文介绍的内存模型是指多线程编程方面,而非对象的内存布局与内存对齐之类。
2024-04-17 22:57:33 363
原创 C++ 并发编程指南(11)原子操作 | 11.4、内存顺序
在多线程编程中,当多个线程试图同时访问和修改共享数据时,就需要考虑数据的一致性和可见性问题。C++的原子操作提供了对共享数据的无锁访问,但仅仅依赖原子操作并不足以完全解决所有同步问题。这时,原子内存序的概念就显得尤为重要。原子内存序定义了原子操作之间的顺序以及这些操作与程序其他部分的交互方式。它影响了编译器优化、指令重排序以及处理器缓存的行为。选择合适的内存序对于实现高效且正确的多线程程序至关重要。
2024-04-17 20:01:36 226
原创 C++ 并发编程指南(11)原子操作 | 11.2、atomic_flag
C++ atomic_flag是C++标准库中的一个原子标志类,用于实现线程间的同步和互斥。它是C++11引入的,提供了一种轻量级的原子操作方式,可以用于实现简单的互斥锁和条件变量等功能。
2024-04-17 19:51:53 312
原创 Qt 实战(2)搭建开发环境 | 2.1、Windows下安装QT
QT官网:https://download.qt.io/,打开官网地址,如下:目录结构介绍。
2024-04-16 19:56:34 524
原创 Qt 实战(1)Qt 概述
Qt(官方发音 [kju:t],音同 cute)是一个的 C++ 开发库,主要用来开发,也可以开发不带界面的命令行(Command User Interface,CUI)程序。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。
2024-04-16 19:48:56 546
原创 操作系统(1)计算机存储结构
计算机存储结构是指计算机系统中用于存储数据和程序的各种硬件设备及其组织方式。它包括了存储器的层次结构、类型、性能参数以及它们之间的相互关系。计算机存储结构的设计直接影响到计算机系统的性能、稳定性和可扩展性。本文将介绍计算机存储结构的基本概念、组成部分以及它们之间的关系。
2024-04-15 23:16:17 764
原创 Visual Studio 配置代码风格审查工具cpplint
cpplint是一个用于检查C++代码风格的工具,它可以帮助我们发现潜在的编码问题,提高代码质量。cpplint遵循Google的C++编码规范,通过静态分析代码来检查潜在的问题,如命名规范、格式、内存管理等。
2024-04-07 16:01:28 1050
原创 C++ 并发编程指南(11)原子操作 | 11.1、基本概念
C++中的原子操作提供了一种在多线程环境中安全地访问和修改共享数据的方式。通过使用std::atomic模板类和相关函数,我们可以实现各种基本和复合类型的原子操作。在实际编程中,原子操作被广泛应用于实现计数器、标志位、并发数据结构和算法等场景。通过合理地使用原子操作,我们可以有效地避免数据竞争和不一致性的问题,从而提高多线程程序的正确性和性能。
2024-03-17 19:24:35 903
原创 C/C++ 知识点:| 与 || 的区别
虽然和||在某些情况下可能看起来行为相似,但它们是两种不同的运算符,用于不同的目的。理解它们之间的区别对于编写正确的C++代码至关重要。按位或运算符用于位操作,而逻辑或运算符||用于逻辑判断。在使用这些运算符时,始终要注意上下文和预期的行为,以确保代码的正确性和效率。
2024-03-14 09:14:32 681
原创 C++ 基础组件(1)定时器
通过结合C++的多线程和时间管理能力,我们可以创建出强大而灵活的定时器。虽然C++标准库没有提供现成的定时器,但我们可以通过上述方式自行实现。这种自定义定时器可以用于各种场合,从简单的计时任务到复杂的异步处理流程,都可以根据需求进行定制。
2024-03-14 09:06:41 379
原创 C++ 并发编程指南(8)线程间通信
在多线程编程中,线程间通信(Inter-Thread Communication,简称ITC)是不可或缺的一部分,它使得不同的线程能够交换信息、协作完成任务。C++作为一种功能强大的编程语言,提供了多种机制来实现线程间的通信。下面我们将详细讨论这些机制。
2024-03-11 17:40:24 1692
原创 C++ 并发编程指南(7)条件变量
C++中的条件变量是实现线程同步的强大工具。通过合理使用条件变量和互斥锁,我们可以有效地控制多个线程对共享资源的访问,确保数据的一致性和正确性。然而,在使用条件变量时,我们也需要注意避免虚假唤醒、死锁和异常处理等问题。
2024-03-11 12:16:24 715
原创 C++ 并发编程指南(5)使用std::lock_guard与std::unique_lock管理锁
在C++的多线程编程中,互斥锁的管理是确保数据一致性和线程同步的关键。std::unique_lock和std::lock_guard是两种用于管理互斥锁的智能锁对象,它们提供了便捷且安全的方式来处理并发访问共享资源的问题。下面我们来详细探讨这两种机制。
2024-03-04 13:54:28 472
原创 C++ 并发编程指南(3)线程同步
文章目录一、线程间共享数据1、线程间共享数据的问题2、使用互斥元保护共享数据一、线程间共享数据1、线程间共享数据的问题2、使用互斥元保护共享数据
2024-02-29 23:02:40 121
原创 C++ 并发编程 | 线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
2024-01-30 22:34:57 206
原创 C++ 并发编程 | std::call_once
某些场景下,需要代码只被执行一次,比如单例类的初始化,考虑到多线程安全,需要进行加锁控制。C++11中提供的。
2024-01-25 14:39:46 611
原创 C++ 新特性 | C++ 11 | std::forward、万能引用与完美转发
是C++11中引入的一个函数模板,用于实现完美转发。它的作用是根据传入的参数,决定将参数以左值引用还是右值引用的方式进行转发。传统上,当一个左值传递给一个函数时,参数会以左值引用的方式进行传递;当一个右值传递给一个函数时,参数会以右值引用的方式进行传递。完美转发是为了解决传递参数时的临时对象(右值)被强制转换为左值的问题。。
2024-01-24 18:12:08 907 1
原创 C++ 并发编程 | future与async
async函数接受两种不同的启动策略,这些策略在:这种策略意味着任务将在调用或函数时延迟执行,也就是任务将在需要结果时同步执行:任务在单独一个线程上异步执行默认情况下async使用// 另起一个线程去运行test_async// 还没有运行test_async_deferred//还没有运行test_async_deferred// 如果test_async这时还未运行完,程序会阻塞在这里,直到test_async运行结束返回。
2024-01-23 22:30:12 431
原创 C++ 并发编程 | 线程的状态
掌握线程状态可帮助我们跟踪程序的执行过程,并解决潜在的竞态条件和死锁问题,掌握它对于编写可靠和高效的多线程应用程序至关重要。
2024-01-21 10:32:31 420
原创 C++ 并发编程 | 条件变量
一个线程因等待"条件变量的条件成立"而挂起另外一个线程使"条件成立",给出信号,从而唤醒被等待的线程为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起;通常情况下这个锁是std::mutex,并且管理这个锁只能是模板类注意:条件变量中只能使用。
2024-01-18 16:54:30 816
原创 C++ 并发编程 | 进程与线程
线程(thread)是操作系统能够进行运算调度的最小单位,其是进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,这些线程共享同一块内存,线程之间可以共享对象、资源,如果有冲突或需要协同,还可以随时沟通以解决冲突或保持同步。
2024-01-17 17:04:13 523
原创 C++ 并发编程 | 锁
mutex又称互斥量,提供了独占所有权的特性,即不支持递归地对 std::mutex 对象上锁。成员函数功能构造函数std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于 unlocked 状态的lock()调用线程将锁住该互斥量unlock()解锁,释放对互斥量的所有权try_lock()尝试锁住互斥量,如果互斥量被其他线程占有,则当前调用线程返回 false,而并不会被阻塞掉自旋锁(spin lock)属于busy-waiting类型锁。
2024-01-17 16:34:18 931
原创 行为型模式 | 观察者模式
让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。观察者模式是解决该类问题的很优秀的方案,使用该模式。
2024-01-11 21:17:22 560
原创 设计模式原理与分析
模式是在软件开发过程中总结得出的一些可重用的解决方案,它能解决一些实际的问题。一些常见的模式,比如工厂模式、单例模式等等。封装、继承、多态只是类的三大特性,在程序设计时并不是说使用到了这三个特性就是面向对象,真正的面向对象的设计要符合设计模式五个原则。
2024-01-11 14:23:20 586
原创 创建型模式 | 建造者模式
又叫生成器模式,是一种对象的构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。创建者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
2024-01-10 22:15:29 640
原创 C++ 对象模型 | 关于对象
下面从虚函数、非虚函数、静态成员变量、非静态成员变量等维度来分析,类对象的内存布局。类,包含前面四种类型的成员。独立于单个实例化对象。
2024-01-08 21:42:11 464
原创 结构型模式 | 适配器模式
重用现有的代码:适配器模式可以允许我们重用已有的类或接口,而不需要修改其原有的代码集成老系统:当现有的系统不满足用户需求时,需要增加系统功能或接口。但是,老系统的接口可能与现有的技术、平台不兼容,此时可以采用适配器模式,将现有的接口适配为新的接口,从而实现新系统的集成集成第三方组件:在使用第三方组件时,可能由于它们实现的 API 不同而导致应用程序复杂,此时可以使用适配器模式,将第三方组件提供的 API 适配为自己需要的 API,方便在应用程序中进行调用实现跨平台兼容。
2023-12-21 22:46:04 559
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人