
c++编程
三体问题
铁锁横江,锦帆冲浪
展开
-
C++使用RAII等待线程完成
一、问题 在大多数情况下,我们需要等待线程完成自己销毁,而不是强制结束,以避免资源泄漏的情况发生。 通常我们使用线程代码是用join#include <iostream>#include <thread>int main(){ bool run = true; std::thread thread_test([&]() { while (run);...原创 2020-12-13 15:00:23 · 366 阅读 · 0 评论 -
CUDA编程初步
CUDA安装过程已经在上一篇文章中讲了。 一、创建 首先需要创建一个CUDA工程,安装后VS会多一个选项如下: 选择,下一步,下一步结果如下:我们发现会出现一个.cu后缀名的文件,这就是GPU使用的源文件。二、前缀和两个常用函数1、在CU文件中有三种函数,前面分别用三种前缀修饰:__device__ void gpu_run();...原创 2020-01-15 20:21:14 · 446 阅读 · 0 评论 -
GPU开发环境搭建(CUDA和 OptiX)
Optix是英伟达一直推出的闭源光线跟踪(rayTracing)引擎 CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员可以使...原创 2020-01-09 19:52:12 · 9158 阅读 · 6 评论 -
记一次c++内存泄漏查找过程
上周从周五开始疯狂修仙,累的一批。 周日正美滋滋的睡着回笼觉,准备补回觉,突然被一个电话打过来去公司查软件内存泄漏问题(连续查了两天)。 当时软件的情况是24 小时内存增加600mb内存,而验收标准是连续跑24 * 7小时,所以对于32位程序来说将达到4.2GB会出现内存无法分配的情况(超出32位指针访问地址的上限)。 分析...原创 2019-12-17 19:36:14 · 460 阅读 · 4 评论 -
C++状态机框架实现
状态机我们大家都知道,有一个专门的设计模式状态机模式,类图大概如下图:不过如果按照下面图来实现的状态机,基本来说非常难用,没有实用性,只能作为教科书的产品。今天我们要实现的是一种通用状态机,可以Send事件,每一个状态可以响应自己注册的事件,同时也可以通过自身或者事件来改变状态机的状态 代码地址:https://github.com/9435202/StateAPI首...原创 2019-10-15 23:27:33 · 15430 阅读 · 5 评论 -
c++消息队列实现
我们经常用到消息队列,把一些数据交给后台线程去处理,而直接使用mutex来lock(),unlock()判断队列是否为空,会使后台线程长时间处于满载状态,或者手动sleep()一段时间,造成使消息处理不及时,所以我们需要实现一个消息队列来实现数据线程的合理使用。 有时任务不是一个,而是很多个连续的数据,仅仅用到mutex和一些其他线程同步方式不能解决问题,需要异步处理的...原创 2019-09-27 21:31:51 · 5540 阅读 · 0 评论 -
特殊循环队列(只读增型)
循环队列大家都知道,可以解决顺序队列的缺陷:在顺序队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”,解决假溢出的途径。 一般的循环列队实现是队列中队列满了就不能增加元素了,今天我们要实现的是一种特殊的循环队列,可以实现无限增加元素,只是在取元素的时候有限制,如果取不到的元素就不会取了。 实现如下: By...原创 2019-09-04 20:59:24 · 225 阅读 · 0 评论 -
c++缓存池实现
一、问题与实现 众所周知,在c++中频繁的new与delete其实是很消耗时间的,在要求高性能的地方,一般需要使用缓存池对内存进行使用与回收。缓存池的意思的就是事先分配好一定的空间,在使用时提供给用户,用户在用完后归还。只在开始和结束时进行new与delete,优势就是可以大大提高效率,劣势就是pop与push必须成对使用,不然就会造成内存泄漏,且非常不容易追踪。 代码实...原创 2019-08-10 09:46:18 · 2552 阅读 · 4 评论 -
std::map自定义类型key
一、起始 众所周知,map是STL库中常用的关联式容器,底层实现就不多提了是平衡二叉树,今天主要关注的是map的KEY值,观看std::map源码如下:template<class _Kty, class _Ty, class _Pr = less<_Kty>, class _Alloc = allocator<pair<const _K...原创 2019-07-18 20:48:51 · 7185 阅读 · 2 评论 -
std::unique_lock源码解析
最近在阅读《c++并发编程实战中》发现了使用了unique_lock类,顺便查看源码,初步了解该类的一些功能,并尝试解析一下,源码如下: // LOCK PROPERTIESstruct adopt_lock_t { // indicates adopt lock explicit adopt_lock_t() = default; };struct defer_lo...原创 2019-07-13 10:16:03 · 1438 阅读 · 0 评论 -
线程同步问题(更新2019.7.13)
问题: 现在有主线程和两个处理线程A、B,主线程一直在以毫秒为单位update数据,A线程每隔1秒将会受到主线程的发出的信号,进行一次update,B线程主要处理A线程中耗时的操作(即需要超过一秒时间的操作)。A线程的平均耗时低于一秒,实现可靠代码。 1.初步想法实现如下: sys_thread.h#ifndef THREAD_SYN_...原创 2019-07-11 22:06:55 · 199 阅读 · 0 评论 -
动态库静态变量陷阱
一、问题 最近李四又遇到了一个动态库的问题,首先软件架构如下: UI进程和后台进程都使用了同一个DLL。 在DLL中有如下代码: export.h#ifndef EXPORT_H#define EXPORT_H#include <mutex>//#define EXPORT_API namespace exp...原创 2019-07-11 22:05:20 · 4154 阅读 · 0 评论 -
线程安全智能指针实现(引用计数)
线程安全指针实现如下:#ifndef INTELLECT_PTR_H#define INTELLECT_PTR_H#include <atomic>#include <assert.h>template <class PTR >class interllect_ptr{public: interllect_ptr()...原创 2019-06-29 21:36:01 · 2492 阅读 · 0 评论 -
VS2017 debug调试内存泄漏查找
最遇到了一个可能内存泄漏问题,根据任务管理器目测,半小时涨了303k内存,感觉上是有内存泄漏,位置未知。 学习了下不通过第三方插件查找内存泄漏的方法。 原理就是通过#define 重定义 new 操作,纪录new操作和delete操作是否匹配 实现如下: #define CRTDBG_MAP_ALLOC #include <...原创 2019-06-28 21:37:39 · 2218 阅读 · 1 评论 -
new/delete完美内存释放
一、new/delete 在c++中新增了new/delete关键字,当我们定义了一个类Class Test;时,auto test = new TestNew() 这条语句将会执行Test的构造函数默认构造函数,例如:class TestNew{public: TestNew() { _i = 0; _c = 0; std::cout <&l...原创 2019-06-21 22:28:45 · 477 阅读 · 2 评论 -
error C3848: 具有类型“const _Hasher”的表达式会丢失一些
使用了一个unordere_map类,采取自定义类型的的key和自定义的hash函数,编译报错,代码如下:#include<unordered_map>struct key{ int _i; int _f; bool operator== (const key& p) const { return _i == p._i && _...原创 2019-06-19 21:33:11 · 2137 阅读 · 0 评论 -
c++任意变量类型获取相关
需要实现一个函数,template <class T> int get_unique_id(T t),传入任意类型的变量,变量类型相同时,返回值id相同,且如果为不同的变量类型返回的id不同(例如 get_unique_id(100) 参数为int类型,返回值为 1,get_unique_id(1000) 参数同样为int类型,返回值为 1, get_unique_id('...原创 2019-06-13 22:12:11 · 1330 阅读 · 0 评论 -
关于c++ 复杂不定参数解析(已解决)
一、 复杂不定参数解析template<class Retype, class... Args>void bind_func(std::string fun_name, Retype(*fun)(Args...)){ // 如何解析出Arg...中参数}代码如上,Arg...解析困难,暂时不知道如何解析:暂时只知道可以重载有限类型来解析参数,例子如下:在已知...原创 2019-06-13 21:27:31 · 923 阅读 · 5 评论