- 博客(12)
- 收藏
- 关注
原创 CRTP, C++的奇异递归模板
通常的继承关系中,多态是通过虚函数实现的,但虚函数会带来一些运行时开销,因为它们需要通过虚函数表(vtable)进行动态分派。而 CRTP使用模板基类来实现多态行为, 则是在编译时就确定了派生类的方法,因此可以避免这种开销。
2024-09-16 01:41:36
238
原创 cmake编译grpc出现问题(Error in configuration process,project files may beinvalid) 以及怎么用virtual stdio配置grpc
接下来配置库路径, 在链接器常规选项下,点击附加库目录,添加我们需要的库目录D:\AAAA\warehouse\grpc\third_party\re2\Debug。我的是报错找不到c编译器,那么我们就可以在config构建的时候,选择。首先我们要配置grpc头文件包含的目录:(注意要用绝对路径)
2024-09-12 00:17:22
1798
原创 C++ shared_from_this详解以及实际用途
我们也可以省略auto self =shared_from_this(),在捕获列表写【self=shared_from_this】。如果不用shared_from_this,那就是在捕获列表直接捕获this,如果在执行异步操作之前,HttpMgr管理者类被销毁了,那么捕获的this指针还试图操作内存,那么就肯定会引发问题。,指向当前对象,增加了引用计数,这样就解决了上面的问题。有人有疑惑用&this也就是捕获引用可不可以,其实是不可以的,因为self是个局部变量。
2024-08-25 22:56:28
385
原创 C++模板化单例类
如果你需要为不同类型的对象实现单例,而没有使用模板化设计,那么你可能需要为每个类型都实现一个单例类,这会导致大量重复代码。另外,由于new底层分配内存的操作(先分配内存,然后调用构造函数构造对象),在多线程环境下,可能会遇到这样的情况:线程A正在执行。这种方式也是既安全又节约资源的,但是静态局部变量的生命周期直到程序结束,因此可能导致实例的销毁时间较长,尽管如此,与双重检查锁定加。相比,静态局部变量法没有额外的性能开销,它只在第一次调用时进行初始化,并且之后不会再进行额外的检查,是更推荐的选择。
2024-08-25 18:28:23
419
原创 在vs中配置boost库,json库
1.首先创建一个cpp项目2.然后点开视图->其他窗口->属性管理器3.如果环境是Debug|x64,就右键Debug|x64添加新项目属性表4.找到VC++目录,然后找到包含目录,把整个boost库的路径添加进去,然后配置库目录,把lib的路径添加进去,配置好之后,点击应用,然后点击确定。5.最后随便找个程序测试一下,如果可以运行就说明配置的没问题。
2024-08-25 03:30:12
433
原创 c++11实现同步、异步线程池
关于worker函数和manager函数的实现,代码注释已经解释的很清楚了,我就不多说了,最后测试的时候发现,管理者线程销毁线程的时候,结果并非预期。F是一个可调用对象,Args是可变参数,addTask的参数是万能引用,返回值是->指向的东西,也就是一个future对象,future内部类型是我们用result_of推导出来的结果,也就是任务函数的结果的类型,把它简化命名为returnType,然后用包装器把一个返回值为returnType,参数为Args的函数也就是任务函数包装成pkg,
2024-08-14 17:05:02
1685
原创 c++ lambda表达式的注意事项
但是加上const之后,发现报错了,明明捕获的是a的副本,但是为什么还会报错呢?执行lambda表达式,发现报错,原因是:默认情况下,lambda 表达式是。这意味着你不能在 lambda 内部修改捕获的变量。当加上mutable关键字,就可以改变捕获的变量。修饰符的影响是对整个变量的,当你捕获一个。变量时,即使是副本,这个副本也具有。
2024-08-14 15:55:21
268
原创 c++并发编程(异步)
我们定义两个函数,分别为mythread,和mythread2:先看mythread就行,第一个参数是primise用来储存返回值,第二个参数是整型值再看主函数,启动了mythread,注意第二个参数promise对象不允许复制,必须是指针或者引用(),而且我们也希望把结果储存到这个对象本身而不是复制的副本中。然后我们通过get_future获得返回值,要注意的future对象也不能被复制,而且也不能用引用传值(future),一般通过move(移动语义)来传递。
2024-08-14 04:07:34
2112
2
原创 c++多线程编程中的虚假唤醒
以编写线程池为例,首先定义了任务队列(m_tasks),存放任务(function包装的函数指针),有多个worker线程执行worker函数,需要从任务队列取出任务,这时候就需要加锁判断任务队列是否有任务,假设任务队列添加一个任务我们使用notify_all唤醒阻塞的子线程时,这时候所有子线程都解除阻塞,如果一个子线程取走了任务,这时候任务队列如果没有任务的情况下,其他的子线程依然尝试从任务队列取任务,就是虚假唤醒(任务队列无任务,子线程仍然被唤醒去取任务)。
2024-08-12 18:57:30
260
原创 在Clion上配置Linux开发环境
5.最后一步,右键项目,然后点击部署,然后点击上传到刚才的远程主机,就可以把本地代码同步到远程Linux系统。因为用的环境都是远程Linux的,所以要确保连接的Linux有这些必要的工具:cmake等,没有的话下载一下就行。3.第三步,配置cmake,因为默认的是本地debug,我们需要远程调试,所以需要添加个新的,这里我其名为remote_debug。然后把工具链选择刚刚配置的远程主机。4.第四步,点击部署,这里的根路径就是浏览远程Linux的根目录,配置完成后可以点击测试连接。
2024-07-25 18:12:44
921
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人