自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(21)
  • 资源 (5)
  • 收藏
  • 关注

原创 组合优于继承

继承很强大,然而会破坏封装性,因而是有问题的。继承有时很脆弱。继承缺点:子类需要很好的了解父类细节,避免出错, 耦合性强。继承优点:差不多就是组合的缺点吧。最著名例子:JpaRepository, 用户继承这个类,即可具备很多默认查询方法。组合的缺点:门面模式时,需要写很多啰嗦的调用原对象接口代码。组合的优点:若父类API设计的不好,可以重新设计API。使用继承时候注意事项,如何更好使用继承。写注释,记录哪些方法会调用子类覆盖的方法。...

2021-08-10 13:22:42 137

原创 KMP算法理解模式字符串的预处理

算法有一个对模式字符串预处理的过程,计算出模式字符串每个字符对应位置的偏移值。这个偏移值被定义为可以作为后缀的最长前缀长度。可以用一堆叠在一起的尖尖帽子来比喻:帽子每一层代表一个字符,不同的帽子,代表不同的前缀,如果可以摞在一起,就表示正好有相同的后缀。前提是帽子顶部不能变,只是在底部截断。这样求每个字符的偏移值,就是求每一层的可以摞起来最长子帽子(定义为向上截取)。用递推法,若第q层已经计算好子帽子k(或者没有),那么第q+1层如果和k+1 相同,那么其子帽子就是k+1.如果不等呢,只

2021-04-01 11:30:10 196 1

原创 c语言某些优于c++的地方

看了好多开源库源码,很多都是c语言,极少c++,印象中只有facebook的thrift,谷歌的glog以及Jsoncpp是用了c++。这可能与库的特点有关,兼容性要强,并不像应用软件一样,对开发周期卡的很紧。这就使得库作者,可以静下心来制作各种轮子,因为可以长期使用,所以这些轮子的制作成本也就分散了。所以关键不在轮子本身,只要轮子足够的好用,不出问题。这就解决了轮子问题。 c++有面向对象,可以将函数和变量封装一下。而c也是有struct的,变量和函数指针也都可以打包在一起,这样...

2021-03-30 14:47:56 149

原创 java volatile 作用

volatile 关键字在java中有同步的语义,表示一个线程更新的变量可以预期传播到别的线程。因为volatile变量不会在寄存器缓存,故而对变量的读取总是可以读取到最新内容的。 可见性不仅仅局限在volatile变量本身,当A线程写入一个volatile变量,而B线程读取这个变量后。所有对A线程在写入操作之前可见的变量,都对B线程可见。故而从内存可见性角度出发,写操作类似加锁,而读取类似解锁。但不应重度依赖这个特征,以免出错或者代码不可读。 典型应用:睡眠线程,定时醒来读取一个状态变量,根据..

2021-03-30 14:47:39 127

原创 memcached 多线程机制

memcache 使用了多线程。多线程内容主要包含线程监听事件的机制,阻塞还是非阻塞;以及主线程和辅助线程的同步机制。 在监听事件机制方面主线程和辅助线程都使用了基于libevent的非阻塞机制。同步机制则使用了管道,即主线程先写入加锁的缓存区,然后向对应管道中写入命令。辅助线程先监听了管道的读,则可以通过读事件获取通知,做出相应处理。主线程仅仅是监听服务端口。值得注意是命令协议格式仅仅为一个字符,可能是为了处理方便。辅助线程负责解析客户端命令,处理命令,最后关闭相应连接。这些工作都是辅助线程完成,..

2021-03-30 14:47:19 569

原创 算法导论摊还分析时间复杂度问题

算法导论17章提到增加栈的multi_pop方法,一次取出若干个元素。因为总共有n个元素,所以n个连续的操作时间复杂度为n,平均下来单次的复杂度仍为O(1). 这也比较好理解,理想情况n次操作,每次取一个,等同于pop,自然是O(1).那么每次取2个呢,前面n/2次就取完了,后面n/2次,为空,总体仍然是O(1).然而别忙,这里关键是必须连续取n次,反之如果连续两次取完,就不会有对应结果。实际情况下,如果有push也有pop,而且是均匀分布的,就未必可行。可见这个摊还分析也是要有前提条件..

2021-03-30 14:46:31 177

原创 更新缓存的一个设计方案

经常遇到后台线程定期更新缓存,而service线程却要实时查询缓存的功能。通常更新缓存的线程为一个,而读取缓存的线程有多个。这正好符合读者写者模型,实际中可以用读写锁来处理。c++中也是推荐这个用法的。实际操作中,有需要注意的细节。比如缓存不大而生成又耗时的情况下,可以先生成缓存对象,此时不需要加锁,然后在加锁的情况下去更新指针。这个指针可以是智能指针也可以是非智能指针,无论哪种情况都需要加锁。对于智能指针情况,智能指针的拷贝、赋值以及析构等操作是线程安全的,这是因为拷贝和赋值只改变了引用计数,

2021-02-02 11:23:52 155

原创 redis6 使用的无锁队列

redis的IO线程与主线程之间使用了无锁队列来传递数据,IO线程中实际有加锁的地方:while (1) {/* Wait for start */ for (int j = 0; j < 1000000; j++) { if (io_threads_pending[id] != 0) break; } /* Give the main thread a chance to stop this thread. */ ...

2020-11-26 15:46:59 333

原创 c++并发编程笔记一 除使用锁以外,保护共享变量方法

有些数据只需要在初始化时进行保护,由于是只读数据,后面也不进行更新。这时在初始化完成后,访问变量时仍然先去加锁,就多余和影响效率了。c++标准为这样的场景提供了一个机制:有些开销大的对象需要延迟初始化,比如数据库连接或者分配大内存。在单线程中需要先判断是否为空,然后再去初始化。在多线程环境下,需要加锁访问,这会导致程序被串行执行,许多人使用双重检查锁方法:即先判断指针是空的情况下,再去加锁和初始化。不幸的是会导致数据竞争。因为锁外面的读操作并没有和加锁后的写操作同步。即使另外的线程看到了对指针写操作

2020-11-25 10:41:48 461

原创 redis 6.0 多线程机制

redis一直以来都是单线程模式,优点是简单不用考虑数据竞争。这次引入了多线程,从命名上来看,也能看出只是针对IO操作,即收发来自socket的数据。至于执行命令,从内存中增删改查,仍然还是单个线程来操作。这样就不必考虑内存中多线程数据竞争问题。而各个端口自己数据的收发,因为是独立的,所以不存在数据冲突的可能。 redis的IO线程设计的功能很有限,而且执行过程也被主线程严格控制。具体是主线程每次给IO线程分配好任务,当然主线程自己也接受任务。主线程完成自己任务后,一定等待辅助线程完成各...

2020-11-24 14:21:30 980

翻译 effective c++ 条款31 避免默认的捕获模式

在c++11中,有两种默认的捕获模式:值捕获和引用捕获。默认的引用捕获可能会造成悬挂引用现象。而默认的值捕获会诱导你产生避免了这类问题想法(实际没有避免),引发你生成闭包是独立的想法(它们也可能不是)。这就是本条款的主要结论。如果你只是工程师而非CEO,想获得更多的细节,接下来我们就开始探讨默认引用捕获带来的悬挂问题。引用捕获使闭包持有了变量的引用,这个变量是个局部变量或者是lamda定义...

2020-04-01 14:16:36 153

翻译 effective c++ 第六章 lamda表达式

lamda表达式-lamda-改变了c++语言的游戏。这有点让人吃惊,毕竟它并未给这门语言带来新的令人印象深刻的表现力。lamda可以做的任何事情,你都可以用手多敲一些代码来完成。然而lamda在创建函数对象上的便捷性,一天又一天的对c++编程产生了巨大的影响。没有lamda时,使用c++的_if算法(std::find_if,std::remove_if,std::count_if)会很琐碎。而...

2020-04-01 11:08:36 93

原创 effective c++ 条款37 在所有路径上,确保std::threads unjoinable

每个std::thread都有两个状态:joinable和unjoinable。每一个可以join的线程对象都关联一个处于运行或者可以运行状态的底层异步线程。对于关联处于阻塞或者等待调度状态的底层线程的线程对象是可以join的。例如关联的底层线程运行结束了,也是可以join的。不可join的线程对象如你所期望的,包含:默认构造的线程对象 没有功能函数,故而没有关联底层可以运行的线程,所以不...

2020-03-27 14:11:57 121

翻译 effective c++ 条款40 并发场景使用std::atomic ,特殊内存场景使用volatile

可怜的volatile,被误解如此之深,就不应该出现在本章,因为它和并发编程毫无关系。但在其他语言(java或者c#),它在并发编程中很用。在某些c++编辑器中,volatile被赋予了特殊语义,使其可以用在并发编程中(但也只有用这些编译器编译才可以用)。即使为了澄清围绕它产生的误解,在关于并发编程的本章中探讨一下volatiile也是有价值的。c++容易混淆属于volatile和std::a...

2020-03-25 16:39:55 582

翻译 effective c++条款39 使用void futures进行一次性事件通知通讯

有时候某个特定事件的发生时,一个线程需要告知另外一个异步运行的线程,因为后者需要等待这个事件才能执行。这个事件可能指一个数据结构的初始化,某个计算过程完成,或者一个重要的传感器的数据已经被监测到。这些情况下,什么是线程之间最佳的通信方式呢?最显而易见的是使用条件变量。我们称呼检测条件变量的线程为检测线程。称呼受影响的线程为处理线程。策略很简单:检测线程通知条件变量,而处理线程会等待这个条件变量...

2020-03-24 17:38:17 137

翻译 effective modern c++ 条款17 理解自动生成的特殊成员函数

根据c++官方说法,特殊成员函数是c++自己生成的。c++98有4个,构造函数,析构函数,拷贝构造函数,赋值拷贝函数。这些函数只是在需要的时候才会生成。比如一些代码调用了这些函数,而之前又没有在类中事前定义这些函数。构造函数只有在你没有自己定义一个构造函数情况下才会自动生成出来。(当你自定义了有参数的构造函数时,阻止了编译器为你自动生成默认构造函数)。这些新生成的函数都是public和inline...

2020-03-20 13:37:41 176

翻译 effective c++条款23 理解std::move和std::forward

知道std::move 和std::forward不做哪些事情时,更容易增加对其了解。std::move没有移动任何东西,而std::forward也没有转发任何东西。程序运行的时候,二者都没有做任何事情。二者都不生成运行时代码,一行也没有。...

2020-03-19 16:21:23 243

翻译 effective modern c++ 条款22 使用Pimpl大法时,在实现文件中定义特定成员函数

如果你曾经与过长的编译时间抗争过,你必定会熟悉Pimpl(指向实现)大法。这种技术将数据成员替换成指向实现类(或结构体)的指针,将之前放到主类中的数据转移到了实现类中,然后通过指针来访问。举例,有这样一个Widget类:class Widget { // 定义在widget.hpublic: Widget();private: ...

2020-03-18 17:57:34 326

翻译 条款19使用shared_ptr管理共享所有权的资源

使用带垃圾回收语言的编程者会笑话c++程序员小心谨慎防止内存泄漏。“真原始” 他们笑道,“你们不看一下1960年Lisp的备忘录吗?应该机器而不是人类去管理资源“ “你说的备忘录里唯一的资源是内存而且释放的时间不确定。我们喜欢更通用以及可预测的析构函数,谢谢你“ 但是垃圾回收语言真的很方便,管理资源生命周期很像用石刀和兽皮去建造一座记忆内存电路。为什么不能同时集中两种优点自动管理(像垃圾收集器)以...

2020-03-10 14:28:57 396

翻译 effective modern c++ 条款18 使用unique_ptr管理独占性资源

当你准备使用智能指针时,应该首先考虑unique_ptr。有理由认为,unique_ptr和原始指针一样大小,对于大部分操作(包括解引用),二者都执行几乎相同的指令。这意味着你甚至可以在内存和时钟周期都很紧张情况下使用它们。如果一个原始指针对你来说足够小也足够快,那么unique_ptr也如此。 unque_ptr包含所有权管理,非空的unique_ptr总拥有它指向的对象。对uniqu...

2020-03-09 10:45:00 247

翻译 effective modern c++ 条款20 当需要处理dangle情形时,使用weak_ptr 而非 shared_ptr

有时使用一种用法类似shared_ptr,而又不参与指向资源的管理的智能指针,会比较方便。这听起来有点自相矛盾。换一种说法,需要一种不改变对象的引用计数智能指针。它可以解判断所指对象是否已经销毁,而shared_ptr是无法判断的。当对象不再存在时,一个真正智能的指针是要能监测到这种情况的。而weak_ptr正是这类指针。 你会想知道什么情况会使用weak_ptr。而你...

2020-03-05 17:58:24 181

局域网二人围棋(vc6)

局域网内的二人围棋,主要应用 多线程,socket,VC++开发技术

2011-09-23

贪吃蛇游戏增强VC6.0开发

经典游戏,相信大家都玩过,基于PC机上的游戏,速度可以自己设定。 设计独特之处: 仍然采用双类,蛇独自成类,蛇体由单链表构成,更简捷明了。可以复习链表数据结构知识。

2011-02-24

附录自动编号系统(毕业设计的好帮手)

大家在添加论文附录时,在前面多加一篇文章往往要改动整个附录的编号。本系统将提供自动从1-n的正序编号功能。用户只需先将附录部分拷贝到一个临时的记事本中,在选中这个记事本即可。

2010-11-15

devc++4.9.9.2 (simple Chinese)

c++ the best compiler to learn c++ (except vc) when you are reading <c++ primer> ,you must use this compiler devc++ ,it is the most suitable one

2009-12-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除