
C++并发编程实战
文章平均质量分 59
Achilles.Wang
勿在浮沙筑高台
展开
-
C++11线程间共享数据
需要注意的是,std::lock_guard并不负责mutex锁对象的生命周期,只是简化了mutex对象加锁和解锁的步骤。但是有些情况下我们必须在获取一个锁的同时获取另外一个锁,这个时候就可以借用std::lock来管理互斥锁防止出现死锁的情况,常用方式见std::lock小节。和lock_guard不同的是,std::unique_lock允许锁之间的传递,比如在两个函数中都需要一把锁中间不间断的一直保护到两个函数结束,那这个时候就可以借用std::unique_lock支持复制传递的特性来实现。原创 2023-01-31 16:10:20 · 707 阅读 · 0 评论 -
计算C++11 变参参数数量
同样该方法在普通变参函数中也适用。原创 2023-01-30 11:20:35 · 206 阅读 · 0 评论 -
C++11并发编程-线程的启用与销毁
通常情况下我们都会在主线程中通过join()函数来等待线程的结束并回收资源,但是有时没有回收的线程时,需要及时将线程分离出去,注意分离出去的线程中能够使用的变量都要保证是非局部的,否则线程会一直在后台运行,如果引用的变量生命周期到了会导致oops。该算法首先根据当前系统中核心个数,以及数据的个数来确定启动线程的个数,确定线程个数之后将数据平均分配给每个线程之后将各个线程计算的结果进行汇总。当你启用一个线程之后,原先线程可能因为抛出异常而退出,这时你可以通过在catch异常时将线程退出来保证程序的正常执行。原创 2022-11-17 11:44:37 · 4086 阅读 · 0 评论 -
C++list常用接口总结
List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。使用时需要添加头文件如果使用的数据插入和删除特别多的话可以考虑使用list来进行数据管理#include <iostream>#include <list>#include <algorithm>using namespace std;int main(int argc, char *argv[]) { list<int>原创 2021-12-30 23:07:54 · 419 阅读 · 0 评论 -
Linux CPU cache
CPU cache目前的CPU都是有三级缓存,一级二级是每个CPU独有的,三级缓存是所有CPU共有的,其中L1的缓存分为数据缓存和指令缓存,如下图所示:虚拟化: VT-xL1d 缓存: 128 KiB // L1数据缓存L1i 缓存: 128 KiB // L1 指令缓存L2 缓存: 1 MiBL3 缓存原创 2021-09-20 12:25:26 · 259 阅读 · 0 评论 -
C++并发编程线程间共享数据std::future和sd::promise
线程间共享数据使用互斥锁实现线程间共享数据为了避免死锁可以考虑std::lock()或者boost::shared_mutex要尽量保护更少的数据同步并发操作C++标准库提供了一些工具 可以用于同步操作,形式上表现为条件变量(condition variables)和期望(futures)C++标准中有两套实现std::condition_variable和std::condition_variable_any这两个实现都包含在<condition_variable>头文件中,前原创 2021-09-04 00:07:54 · 465 阅读 · 0 评论 -
C++内存模型和原子类型操作
C++内存模型和原子类型操作std::memory_order初探动态内存模型可以理解为存储一致性模型,主要是从行为上来看多个线程对同一个对象读写操作时所做的约束,动态内存理解起来会有少许复杂,涉及到内存、Cache、CPU的各个层次的交互。如下有两个线程,分别对a、R1、b、R2进行赋值,根据线程执行的顺序可能有以下几种情况在不对线程进行任何限制,线程内部指令不进行重排的情况下。可以有4!/(2!*2!)=6中情况在不考虑优化和指令重排的情况下,多线程有如下两种情况:程序最终执行的结果,是原创 2021-08-15 21:06:23 · 574 阅读 · 0 评论 -
万字长文带你一文读完Effective C++
Effective C++视C++为一个语言联邦STL Template C++ C Object-oriented C++一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更加无拘无束,接受不同于C with classes的各种观念、特性和编程战略。异常对函数的结构化带来了不同的做法,templates将我们带来到新的设计思考方式,STL则定义了一个前所未见的伸展性做法。今天C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式原创 2021-08-10 20:15:40 · 1228 阅读 · 0 评论 -
C++优化热点语句
优化热点语句提前计算固定值先观察下面的性能测试代码:static void find_blank(benchmark::State& state) { for (auto _: state) { char s[] = "This string has many space (0x20) chars. "; for (size_t i = 0; i < strlen(s); ++i) if (s[i] == ' ')原创 2021-05-31 23:26:56 · 491 阅读 · 1 评论 -
C++性能优化-字符串的优化
字符串的优化糟糕的字符串连接函数在C++中字符串是按照值的形式实现的,又因为C++中字符串底层是使用动态内存实现的,因此、在项目中对字符串的优化必不可少,也是性能优化的重点。假如代码中有如下remove_ctrl函数的实现:std::string remove_ctrl(std::string s) { std::string result; for (int i=0; i<s.length(); ++i) { if(s[i] >= 0x20)原创 2021-05-25 23:54:33 · 1182 阅读 · 5 评论 -
C++中的RAIL风格
RAIL风格RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可将其翻译为“资源获取就是初始化”。虽然从某种程度上说这个名称并没有体现出该惯性法的本质精神,但是作为标准C++资源管理的关键技术,RAII早已在C++社群中深入人心。因为系统的中的资源不是无限的,因此、通常没有使用RAIL风格的使用方式是获取资源使用资源释放资源如:void fileHandler() { FILE原创 2021-05-23 21:10:11 · 749 阅读 · 1 评论 -
原子操作和互斥量的区别
原子操作和互斥量的区别原子操作和互斥锁都是并发编程中常见的技术。原子操作原子操作就是操作过程中不能被中断的过程,在针对某个值得原子操作,在被进行的过程中CPU绝对不会再进行其他的针对该值的操作。原子操作仅会由一个CPU指令代表和完成,原子操作是无锁的,常常直接通过CPU指令直接实现。其他同步技术实现常常依赖于原子操作。互斥锁和原子锁的区别严格来说互斥锁是一个数据结构,是写代码开发人员人为约束的一种都要遵循的一系列操作。 原子操作是单个不可被打断的操作,没有其他线程可以打断它。原子操作的优势是更原创 2021-05-05 23:06:00 · 946 阅读 · 0 评论 -
C++异常处理
github代码提交记录异常处理机制若是有异常则通过throw操作创建一个异常对象并抛掷将可能抛出异常的程序段嵌入到try块之中,控制通过正常的顺序执行到try语句,然后执行try块内的保护段如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行,程序从try块后跟随者最后一个catch子句后面的语句继续执行下去。catch子句按其在try块后出现的顺序被检查,匹配的catch子句将捕获并处理异常如果匹配的处理器未找到,则执行函数teminate将自动调用,其缺省功能是调原创 2021-04-25 17:45:02 · 661 阅读 · 2 评论 -
草稿
#include <mutex>#include <algorithm>#include <iostream>#include <string>#include <vector>#include <map>using namespace std;once_flag apnDataFlag;struct APN_DATA{ string CP; // 国家运营商 string APN;原创 2021-04-08 16:27:36 · 135 阅读 · 0 评论 -
使用互斥元保护共享数据-lock_guard
用互斥元保护共享数据线程相对于进程的优势在于能够共享数据,线程相对于进程的劣势也在于数据能够共享。如何多个线程安全的访问数据,你可以使用互斥锁保护数据,也可以优化数据结构使用无锁编程,或者使用事务保证数据同一时间只能被一个线程访问。这里主要说的就是如何使用互斥锁对数据进行保护,使用互斥锁有一个问题就是需要使用者,在需要更改数据的时候调用lock()对数据加锁,在更改数据结束之后调用unlock()对数据解锁,如果漏掉解锁或者因为异常处理原因跳过解锁函数会导致死锁。人为的去加锁和解锁不可避免的会出现只写原创 2021-04-01 19:54:03 · 185 阅读 · 1 评论