C++
文章平均质量分 67
Hello,C++!
这个作者很懒,什么都没留下…
展开
-
《C++ STL开发技术引导》 第五章-C++ STL泛化技术分析笔记
for_each的定义。for_each的实例。原创 2023-02-08 10:01:30 · 633 阅读 · 0 评论 -
有关C++ Traits编程技法
真是不得不佩服C++知识内容的庞大,最近在啃侯捷的《STL源码剖析》这本书,看到第三章迭代器知识有关 traits 的部分一脸蒙蔽,无奈只能向度娘寻求帮助。C++ STL 泛化,全特化,偏特化。模板的特化和偏特化以及相关理解。关于模板的泛化、全特化和偏特化。C++模板之特化与偏特化详解。C++模板的全特化和偏特化。C++模板全特化、偏特化。C++模板的特化详解。模板的全特化和偏特化。转载 2023-02-07 14:03:09 · 153 阅读 · 0 评论 -
【C++模版之旅】神奇的Traits
现在需求变了,需要在T为int类型时,Compute方法的参数为int,返回类型也为int,当T为float时,Compute方法的参数为float,返回类型为int,而当T为其他类型,Compute方法的参数为T,返回类型也为T,怎么做呢?介绍traits的文章很多,但感觉大部分文章的说明都很晦涩难懂,把一个并不很复杂的C++模板的应用描述的过于复杂。假设有这样的需求,类Test中的某部分处理会随着类型T的不同而会有所不同,比如希望判断T是否为指针类型,当T为指针类型时的处理有别于非指针类型,怎么做?转载 2023-02-07 13:55:14 · 111 阅读 · 0 评论 -
原子操作,内存屏障,锁
内存屏障还有两种隐式的屏障变种:LOCK和UNLOCK操作(表面上这两个操作的实际用途和原子操作里面的Lock解释有区别,原子操作里面的lock是锁内存总线,这里面的lock是保证执行的执行顺序严格按照lock前,lock中,lock后的顺序执行)5.锁:从上面可以看出内存屏障并不是锁,而锁是使用了内存屏障实现的一种用户层的同步处理方式,锁使用的汇编原语有LOCK,UNLOCK等是内存屏障的一种隐式形式,它们都是LOCK操作和UNLOCK操作的变种,所以几乎所有的锁都使用了内存屏障,转载 2023-02-03 09:31:50 · 704 阅读 · 0 评论 -
什么是内存屏障?具有什么作用?
小陈:老王,上一篇你引出了volatile底层是通过内存屏障来解决可见性和有序性问题的。首先我想问一下什么是内存屏障?老王:内存屏障啊,本质上也是一种指令,只不过它具有屏障的作用而已。小陈:额,这怎么说…老王:首先内存屏障是一种指令,无论是在JAVA内存模型还是CPU层次,都是有具体的指令对应的,是一种特殊的指令。小陈:嗯嗯,它是一种特殊的指令。还是不明白…小陈:然后呢?老王:然后这种指令*具有屏障的作用*,所谓屏障,也就是类似关卡,类似栅栏,具有隔离的作用。小陈:那它是怎么实现隔离作用的,能否搞个例子讲一转载 2022-08-25 15:33:00 · 488 阅读 · 0 评论 -
实现上下文保存和恢复的一种方式--setjmp与longjmp
longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值。longjmp函数本身是没有返回值的,它执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。上面的说明有点拗口,通俗的解释是:先调用setjmp,用变量envbuf记录当前的位置,然后调用longjmp,返回envbuf所记录的位置,并使setjmp的返回值为val。当时用longjmp时,envbuf的内容被销毁了。.原创 2022-08-24 17:07:10 · 643 阅读 · 0 评论 -
CPU缓存:怎样写代码让CPU执行更快?
我们先从主机最重要的部件 CPU 开始,聊聊如何通过提升 CPU 缓存的命中率来优化程序的性能。任何代码的执行都依赖 CPU,通常,使用好 CPU 是操作系统内核的工作。然而,当我们编写计算密集型的程序时,CPU 的执行效率就开始变得至关重要。由于 CPU 缓存由更快的 SRAM 构成(内存是由 DRAM 构成的),而且离 CPU 核心更近,如果运算时需要的输入数据是从 CPU 缓存,而不是内存中读取时,运算速度就会快很多。所以,了解 CPU 缓存对性能的影响,便能够更有效地编写我们的代码,优化程序性能。然转载 2022-08-23 15:21:37 · 802 阅读 · 0 评论 -
cmake入门学习笔记
cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。CMake可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake支持in-place建构(二进档和源代码在同一个目录树中)和out-of-place建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake也支持静态与动态程式库的建构。...............................原创 2022-07-25 09:34:32 · 599 阅读 · 0 评论 -
《C++ Concurrencyin Action》第10章--多线程程序的测试和调试
本章主要内容· 并发相关的错误· 定位错误和代码审查· 设计多线程测试用例· 多线程代码的性能目前为止,我们了解如何写并发代码——可以使用哪些工具,这些工具应该如何使用。不过,在软件开发中重要的一部分我们还没有提及:测试与调试。如果你希望阅读完本章后就能很轻松的去调试并发代码,本章无法满足你的预期。测试和调试并发代码比较麻烦。除了对一些重要问题的思考,我也会展示一些技巧让测试和调试变得简单一些。测试和调试就像一个硬币的两面——测试是为了找到代码中可能存在的错误原创 2022-07-12 16:52:05 · 468 阅读 · 0 评论 -
《C++ Concurrencyin Action》第9章--高级线程管理
本章主要内容· 线程池· 处理线程池中任务的依赖关系· 池中线程如何获取任务· 中断线程之前的章节中,我们通过创建std::thread对象来对线程进行管理。在一些情况下,这种方式不可行了,因为需要在线程的整个生命周期中对其进行管理,并根据硬件来确定线程数量,等等。理想情况是将代码划分为最小块,再并发执行,之后交给处理器和标准库,进行性能优化。另一种情况是,当使用多线程来解决某个问题时,在某个条件达成的时候,可以提前结束。可能是因为结果已经确定,或者因为产生错原创 2022-07-12 16:50:14 · 381 阅读 · 0 评论 -
《C++ Concurrencyin Action》第8章--并发代码设计
第8章 并发代码设计本章主要内容• 线程间划分数据的技术• 影响并发代码性能的因素• 性能因素是如何影响数据结构的设计• 多线程代码中的异常安全• 可扩展性• 并行算法的实现之前章节着重于介绍使用C++11中的新工具来写并发代码。在第6、7章中我们了解到,如何使用这些工具来设计可并发访问的基本数据结构。这就好比一个木匠,其不仅要知道如何做一个合页,一个组合柜,或一个桌子;并发的代码的使用,要比使用/设计基本数据结构频繁的多。要将眼界放宽,就需要构建更大的结构,进行高效的工作。我将使用多线程化原创 2022-07-12 16:48:22 · 627 阅读 · 0 评论 -
《C++ Concurrencyin Action》第7章--无锁并发数据结构设计
本章主要内容:1、设计无锁并发数据结构2、无锁结构中内存管理技术3、对无锁数据结构设计的简单指导上一章中,我们了解了在设计并发数据结构时会遇到的问题,根据指导意见指引,确定设计的安全性。对一些通用数据结构进行检查,并查看使用互斥锁对共享数据进行保护的实现例子。第一组例子就是使用单个互斥量来保护整个数据结构,但之后的例子就会使用多个锁来保护数据结构的不同部分,并且允许对数据结构进行更高级别的并发访问。互斥量是一个强大的工具,其可以保证在多线程情况下可以安全的访问数据结构,并且不会有条件竞争或破坏不变量的情况存原创 2022-07-12 16:39:16 · 812 阅读 · 0 评论 -
《C++ Concurrencyin Action》第6章--基于锁的并发数据结构设计
本章主要内容:1、并发数据结构设计的意义2、 指导如何设计3、实现为并发设计的数据结构在上一章中,我们对底层原子操作和内存模型有了详尽的了解。在本章中,我们将先将底层的东西放在一边(将会在第7章再次提及),来对数据结构做一些讨论。数据结构的选择,对于程序来说,是其解决方案的重要组成部分,当然,并行程序也不例外。如果一种数据结构可以被多个线程所访问,其要不就是绝对不变的(其值不会发生变化,并且不需同步),要不程序就要对数据结构进行正确的设计,以确保其能在多线程环境下能够(正确的)同步。一种选择是使用独立原创 2022-07-12 15:10:13 · 333 阅读 · 0 评论 -
《C++ Concurrencyin Action》第5章--C++内存模型和原子类型操作
本章主要内容C++11标准中,有一个十分重要特性,常被程序员们所忽略。它不是一个新的语法特性,也不是新的工具,它就是新的多线程(感知)内存模型。内存模型没有明确的定义基本部件应该如何工作的话,之前介绍的那些工具就无法正常工作。那为什么大多数程序员都没有注意到它呢?当你使用互斥量保护你的数据和条件变量,或者是“期望”上的信号事件时,对于互斥量为什么能起到这样作用,大多数人不会去关心。只有当你试图去“接触硬件”,你才能详尽的了解到内存模型是如何起作用的。C++是一个系统级别的编程语言,标准委员会的目标之一就是不原创 2022-07-12 14:26:03 · 402 阅读 · 0 评论 -
《C++ Concurrencyin Action》第4章--同步并发操作
在上一章中,我们看到各种在线程间保护共享数据的方法。当你不仅想要保护数据,还想对单独的线程进行同步。例如,在第一个线程完成前,可能需要等待另一个线程执行完成。通常情况下,线程会等待一个特定事件的发生,或者等待某一条件达成(为true)。这可能需要定期检查“任务完成”标识,或将类似的东西放到共享数据中,但这与理想情况还是差很多。像这种情况就需要在线程中进行同步,C++标准库提供了一些工具可用于同步操作,形式上表现为条件变量(condition variables)和期望(futures)。在本章,将讨论如何使原创 2022-07-11 17:06:50 · 371 阅读 · 0 评论 -
《C++ Concurrencyin Action》第3章--线程间共享数据
本章主要内容上一章中,我们已经对线程管理有所了解了,现在让我们来看一下“共享数据的那些事”。想象一下,你和你的朋友合租一个公寓,公寓中只有一个厨房和一个卫生间。当你的朋友在卫生间时,你就会不能使用了(除非你们特别好,好到可以在同时使用一个房间)。这个问题也会出现在厨房,假如,厨房里有一个组合式烤箱,当在烤香肠的时候,也在做蛋糕,就可能得到我们不想要的食物(香肠味的蛋糕)。此外,在公共空间将一件事做到一半时,发现某些需要的东西被别人借走,或是当离开的一段时间内有些东西被变动了地方,这都会令我们不爽。同样的问题原创 2022-07-11 13:43:34 · 284 阅读 · 0 评论 -
《C++ Concurrencyin Action》第2章--线程管理
好的!看来你已经决定使用多线程了。先做点什么呢?启动线程、结束线程,还是如何监管线程?在C++标准库中只需要管理std::thread关联的线程,无需把注意力放在其他方面。不过,标准库太灵活,所以管理起来不会太容易。本章将从基本开始:启动一个线程,等待这个线程结束,或放在后台运行。再看看怎么给已经启动的线程函数传递参数,以及怎么将一个线程的所有权从当前std::thread对象移交给另一个。最后,再来确定线程数,以及识别特殊线程。每个程序至少有一个线程:执行main()函数的线程,其余线程有其各自的入口函数原创 2022-07-11 11:22:56 · 327 阅读 · 0 评论 -
《C++ Concurrencyin Action》第1章--你好,C++的并发世界!
本章主要内容· 何谓并发和多线程· 应用程序为什么要使用并发和多线程· C++的并发史· 一个简单的C++多线程程序令C++用户振奋的时刻到了。距初始的C++标准(1998年)发布13年后,C++标准委员会给语言本身,以及标准库,带来了一次重大的变革。新C++标准(也被称为C++11或C++0x)在2011年发布,带来一系列的变革让C++编程更加简单和高效。其中一个最重要的新特性就是对多线程的支持。C++标准第一次承认多线程在语言中的存在,并在标准库中为多线程原创 2022-07-11 11:07:39 · 743 阅读 · 0 评论 -
linux源码解读系列
linux源码原创 2022-07-08 09:59:38 · 9073 阅读 · 1 评论 -
使用gdb添加断点的几种方式
GDB转载 2022-06-28 16:31:54 · 6070 阅读 · 0 评论 -
记录一次循环引用的问题
C++原创 2022-06-25 15:42:43 · 373 阅读 · 0 评论 -
C++11获取变量类型
class TestA{};int main(){ TestA a; std::cout << typeid(a).name() << std::endl;}原创 2022-03-16 13:25:31 · 1367 阅读 · 0 评论 -
C++封装的基于libevent的HTTP 服务器(含源码)
原文地址:https://blog.csdn.net/atp1992/article/details/99708245?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Ede转载 2021-11-17 10:37:30 · 449 阅读 · 0 评论 -
websocketpp库禁用某些日志
m_server.clear_access_channels(websocketpp::log::alevel::frame_header); m_server.clear_access_channels(websocketpp::log::alevel::control);原创 2021-11-13 17:43:38 · 654 阅读 · 0 评论 -
github上多线程demo
ThreadPool.h#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <vector>#include <queue>#include <memory>#include <thread>#include <mutex>#include <condition_variable>#include <future>#include <functio转载 2021-11-12 14:01:19 · 337 阅读 · 0 评论 -
std::cout输出十六进制数据
std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x99, 0xff}; std::ofstream ofs("test.txt", std::ios::app); for (int i = 0; i < data.size(); i++) { std::cout << std::hex << (int)data[i] << " "; } std::cout << std::endl;.原创 2021-11-05 18:07:20 · 9633 阅读 · 0 评论 -
删除多余dll库的方法
运行exe程序后,选中所有的dll文件,然后点击删除。如果可以成功删除的话,则此库是多余的。原创 2021-10-20 16:06:54 · 456 阅读 · 0 评论 -
mutable的使用
当类的某个函数被声明为const,但是后期扩展又需要修改某个类成员变量的时候。如果只接修改会报错:表达式必须是可修改的左值。此时可以在变量前面添加mutable修饰,这样即使函数是const,但仍可以修改这个类成员变量。例子如下:直接使用会报错:class Test{public: void setData(const int data) const;private: int _data;};void Test::setData(const int data) const{ _da原创 2021-04-26 10:05:52 · 298 阅读 · 0 评论 -
关于子线程被打断执行的问题
代码如下:#include <iostream>#include <windows.h>#include <boost/thread/thread.hpp>using namespace std;void print(){ while (!boost::this_thread::interruption_requested()) { std::cout << "111" << std::endl; Sleep(1000)原创 2021-04-23 17:42:34 · 280 阅读 · 0 评论 -
根据经纬度计算两点距离的方法
#include <iostream>#include <cmath>using namespace std;#define pi 3.1415926535897932384626433832795#define EARTH_RADIUS 6378.137 //地球半径 KMdouble rad(double d){ return d * pi / 180.0;}double RealDistance(double lat1, double lng1, doub原创 2021-03-05 12:37:04 · 1224 阅读 · 0 评论 -
2020-10-09
try { auto messagePtr = serialization::unpack(packet->data); if (typeid(*messagePtr) == typeid(const sinftech::msg::tv::StartVideo)) { auto startVideoMsg = reinterpret_cast<sinftech::msg::tv::StartVideo*>(&(*messagePtr)); ...原创 2020-10-09 13:42:19 · 111 阅读 · 0 评论 -
windows bat定时重启软件
@echo offtitle Restart Collector OnTime:whiletaskkill /f /im Collector.exestart Collector.exeset d=%date:~0,10%set t=%time:~0,8%echo restart Collector success,%d% %t%choice /t 12 /d y /n >nulgoto :while原创 2020-09-07 18:08:56 · 965 阅读 · 0 评论 -
c++实现http客户端和服务端的开源库以及Base64加密密码
cpp-httplib的链接地址:https://github.com/yhirose/cpp-httplib/blob/master/example/benchmark.cc原创 2020-06-24 11:12:49 · 1409 阅读 · 1 评论 -
将字符串以某个分隔符分隔
话不多说,直接上代码:// 将str字符串以“division”字符分隔,最终结果生成多个子字符串并保存到vStr中。void StringSplit(const std::string& str, std::vector<std::string>& vStr, const char& division){ try { int startPos = 0; int endPos = std::string::npos; startPos = str.原创 2020-06-15 15:21:45 · 1116 阅读 · 0 评论 -
error C2664: 不能将参数 1 从“const TCHAR [256]”转换为“const wchar_t *”
TCHAR 在多字节的前提下是char类型,在unicode下才是wchar_t类型的,所以需要设置成unicode的字符集。工程中使用Unicode字符集。原创 2020-05-29 16:41:12 · 2286 阅读 · 0 评论 -
protobuf序列化string数据遇'\0'截断问题
sMainFrame 是序列化之后的string对象,大小为sMainFrame.size(); 此时 根据数据的不同, 进行测试会出现 sMainFrame.size() 与 strlen(sMainFrame.c_str()) 大小不一致,我还 以为是序列化不成功,其列化是成功的,不过string中有’\0’字符,这样比较是不合理的。 应该在反序列化处进行处理。具体方法如下:...转载 2020-03-30 00:24:28 · 1611 阅读 · 0 评论 -
MFC中调用WPF教程
呵呵, 这几天看到社区里大家对如何在vc中调用WPF兴致很高, 现在我就带领大家按部就班来实现它.废话不说了, 开始.WPF是微软主推的新一代桌面程序开发技术, 它极大加快了程序界面开发,也增强了界面的用户体验,至于详细的介绍大家可以google, 本文主要还是介绍如何在vc中处理wpf数据和事件.开发工具嘛vs2008+sp1+[Blend].1.新建一个项目MFCHostWpf, 建立...转载 2020-01-03 10:46:37 · 741 阅读 · 0 评论 -
64位linux机器编译32位开源库
./configure --prefix=/usr/local/ CFLAGS=-m32 CXXFLAGS=-m32原创 2020-01-02 14:47:11 · 518 阅读 · 0 评论 -
用wcout输出有汉字的wstring
必须要加入这条语句才可以输出汉字wcout.imbue(std::locale(“chs”));//必须加这一句,才能输出有汉字的wstring。wcout 不能用来输出 string对象。cout 也不能用来输出 wstring 对象。...原创 2019-12-27 18:01:44 · 311 阅读 · 0 评论 -
宽字节字符集(Unicode)、多字节字符集(Multi-Byte) 自适应
CString 转 stringCString cstrTest = _T("test");string strTest;string = CT2A(cstrTest.GetString());string 转 CStringstring strTest="test";CString cstrTest;cstrTest= CA2T(strTest.c_str());这里使...转载 2019-12-20 15:54:12 · 531 阅读 · 0 评论