<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[adlatereturn的博客]]></title><description><![CDATA[？？？]]></description><link>https://blog.youkuaiyun.com/adlatereturn</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; adlatereturn]]></copyright><item><title><![CDATA[gdb学习笔记]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/110496315</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/110496315</guid><author>adlatereturn</author><pubDate>Wed, 02 Dec 2020 20:12:45 +0800</pubDate><description><![CDATA[gdb a.out -q 减少免责输出
gdb 中c（continue）是在断点间跳跃的意思
通过修改配置文件/proc/sys/kernel/core_pattern可以配置core文件的位置和命名格式,通过gdb ./a.out core-a.out-4879-1606749459可以调试core程序,可以看到程序崩掉的位置,#0 0x0000564a73ae3129 in main () at test1.c:6
在gdb中file ./a.out可以读入可执行文件
gdb --args ./a.o.]]></description><category></category></item><item><title><![CDATA[build my own sqlite]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/109594536</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/109594536</guid><author>adlatereturn</author><pubDate>Tue, 10 Nov 2020 14:45:05 +0800</pubDate><description><![CDATA[多级缓存
b树
缓存未击中

]]></description><category></category></item><item><title><![CDATA[github 3.7k star c++线程池简析]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/109476690</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/109476690</guid><author>adlatereturn</author><pubDate>Tue, 03 Nov 2020 20:47:06 +0800</pubDate><description><![CDATA[github链接
在学习多线程的时候必不可少的一个知识点就是线程池，在web服务器中我们就常常会遇见它。在c++中没有标准的线程池，但这个轮子其实早就被大牛们造好了，现在我们就来看看这个github高星线程池的实现。




workers
tasks




线程vector（消费者）
任务队列(生产者)




接口

ThreadPool(size_t);
enqueue(F &amp;&amp;f, Args &amp;&amp;… args);
~ThreadPool();
用户通过enqueue]]></description><category></category></item><item><title><![CDATA[为了1024小勋章，我写了一篇博客]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/109264449</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/109264449</guid><author>adlatereturn</author><pubDate>Sat, 24 Oct 2020 19:42:54 +0800</pubDate><description><![CDATA[哈哈哈哈哈，今天水一篇博客。最近几天其实学的东西也比较难，c++ std::future那些东西还没有代码写一遍，没有记录的必要。至于muduo更是搁置在一旁的，py倒是看了好多，过了几本书，但还是很不够，有些类魔法语法还是没看多少，今天也才刚知道@修饰器的玩法，可能cookbook上有，但我还没看到。可能是因为py太香，好多成型的库，眼花缭乱，暂时学的库的知识比语法要多得多，但也不扎实，仅仅玩过。过段时间再系统学c++叭我想，花过多时间学py还是不太靠谱，我也还没有写c++项目，比如重要的webserve]]></description><category></category></item><item><title><![CDATA[真香！终于知道怎么解决c++死锁了]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/109137971</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/109137971</guid><author>adlatereturn</author><pubDate>Sun, 18 Oct 2020 11:51:17 +0800</pubDate><description><![CDATA[死锁
在写c/c++的过程中遇到死锁常常会让我们手无足错，因为死锁往往不像其他类型的错误一样会在终端直接打印报错，因此难以被发现并需要大量精力去排错。是时候思考，该如何防范或者避免死锁。


死锁场景1

在类里面或者全局无意识的使用过多的锁，并在函数中调用这些锁的时候未注意到锁的次序。如一个线程执行函数fun1时锁的顺序是Ａ－&gt;B－&gt;Ｃ，另一个线程执行fun2时锁的顺序是Ｃ－&gt;B－&gt;Ａ ,除非能保证fun1，fun2不会同时执行，否则及其容易发生死锁。



解决途径1

如果使用]]></description><category></category></item><item><title><![CDATA[双检查锁的错误]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/109133084</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/109133084</guid><author>adlatereturn</author><pubDate>Sat, 17 Oct 2020 16:35:53 +0800</pubDate><description><![CDATA[为了减小锁的粒度，先人创造了双检查锁。
双检查锁的缺点或者说错误是什么？
void undefined_behaviour_with_double_checked_locking()
{
  if(!resource_ptr)  // 1
  {
    std::lock_guard&lt;std::mutex&gt; lk(resource_mutex);
    if(!resource_ptr)  // 2
    {
      resource_ptr.reset(new some_resour]]></description><category></category></item><item><title><![CDATA[Clion编译,运行单个cpp文件]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/109078533</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/109078533</guid><author>adlatereturn</author><pubDate>Wed, 14 Oct 2020 17:20:17 +0800</pubDate><description><![CDATA[之前一直用终端
g++　
./a.out
经查阅：
clion的Extend Tools里加上并配置俩小按钮就ok了
linux下这些${FileDir}$也没有什么不同



我多加了一个常用的-lpthread来动态链接线程库，暂时也就这个用的多
然好给这俩小按钮设置个keymap快捷键，然后真的可以跑了！我设置为alt+P 和alt+J




...]]></description><category></category></item><item><title><![CDATA[python 使用BeautifulSoup爬取优快云博客(1)]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/109037551</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/109037551</guid><author>adlatereturn</author><pubDate>Mon, 12 Oct 2020 21:48:57 +0800</pubDate><description><![CDATA[最近刚好学py,刚好小组的群博好久没更新了
便想拿py来试试水
通过右上角打开rss订阅　

其中有很多是你之前的博客，但不是全部，这里我大概40篇博客它仅仅更新了
10多篇

接下来将这个rss的url 通过py脚本获取其中带
&lt;a&gt;&lt;href="https://blog.youkuaiyun.com/adlatereturn/article/details/108889759"&gt;&lt;/a&gt;
的标签，这并不难,需要注意的是需要 BeautifulSoup(html, ‘lxml’),]]></description><category></category></item><item><title><![CDATA[ubuntu下mysql密码失效解决的正确方式]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/108889759</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/108889759</guid><author>adlatereturn</author><pubDate>Wed, 30 Sep 2020 20:07:18 +0800</pubDate><description><![CDATA[之前一直用免密码登录 ???????? ????，今天再次找方法去修改密码，但网上方法一直失效，直到找到这篇，
blog
mysql&gt; update mysql.user set authentication_string=password("123456"),plugin='mysql_native_password' where user='root';

其实就比网上多一步操作,update mysql.user中 修改plugin='mysql_native_password'就完事了，否则将]]></description><category></category></item><item><title><![CDATA[std::forward备忘录]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/108732422</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/108732422</guid><author>adlatereturn</author><pubDate>Tue, 22 Sep 2020 15:46:41 +0800</pubDate><description><![CDATA[尽管每次都觉得自己懂了std::move和std::forward,但每隔一段时间拿出来一翻又会画上自己一段时间思考，索性写篇博文,证明自己是会的（just forget）
std::forward的使用需求：
exec(fun f, a tmpa, b tmpb
下图1的exec模板函数传入a,b类型对象的拷贝（虽说此处传入int）,效率低．
下图2的exec模板函数传入a,b类型对象的左值引用（虽说此处传入int）不可直接传6这种右值.
下图3当 tmp的参数是右值引用时，由于exec中的tmpb是左值]]></description><category></category></item><item><title><![CDATA[对LinYaCool WebServer 的学习(仿muduo)(http)]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/108502385</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/108502385</guid><author>adlatereturn</author><pubDate>Thu, 10 Sep 2020 14:00:06 +0800</pubDate><description><![CDATA[怎么说呢,又看了一个模仿moduo的server,不过之前那个mini-muduo是echo服务器,这个是http服务器,思想都差不多,在并发模型上这个服务器使用的是Reactor +线程池 ,每个连接子线程也是一个Reactor,这也是我第一次看到这种模型的实现,它相对mini-muduo的优点还有它使用了智能指针来避免内存泄漏,这的确增大了编程的难度,但其保证内存不泄漏的确是程序员格外需要去注意的地方.
大致有这些类
Server(入口类,其中包含了Accptor 用来处理连接事件)
Channel (]]></description><category></category></item><item><title><![CDATA[对别人写的mini-muduo的学习]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/108356380</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/108356380</guid><author>adlatereturn</author><pubDate>Wed, 02 Sep 2020 18:28:52 +0800</pubDate><description><![CDATA[之前想学muduo 但因为一些原因，暂时编译不过，碰巧看到一个博主是模仿着muduo写的mini-muduo，看了看觉得挺好，仅仅实现Echo服务器，从最简单的epoll模型开始到反应堆+多线程,为了简洁没有使用智能指针（它也提示了会内存泄漏），部分有bug,但依旧是一个很好的学习对象。本文就最后的　反应堆+多线程模型作一下分析。(原文分成了13小节)
main.cpp
#include "TcpServer.h"
#include "EventLoop.h"
#include "EchoServer.h"]]></description><category></category></item><item><title><![CDATA[c++网络五子棋Linux版]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/108046579</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/108046579</guid><author>adlatereturn</author><pubDate>Mon, 17 Aug 2020 00:49:54 +0800</pubDate><description><![CDATA[这次写的是一个网络版五子棋
怎么说的，这次的cpp文件文件比较多，我就贴个github代码吧
github
编译主要看 makefile里那几个文件
实现了　登录　匹配下棋。
服务器用了　epoll+线程池（模仿《linux高性能编程写的》）但这次的教训就是这个棋局的主体业务逻辑应该放在服务器（我写在客户端由客户端判断棋局是否结束），而且线程池处理也是计算密集型任务，在这种俩个用户并非同时下棋的程序中可以不用。更何况放在客户端的业务逻辑可以伪造的，这样服务器就可能收到伪造的数据。
给大家看下效果：

经验：]]></description><category></category></item><item><title><![CDATA[EffectiveC++学习笔记]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/107753159</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/107753159</guid><author>adlatereturn</author><pubDate>Sun, 02 Aug 2020 22:43:41 +0800</pubDate><description><![CDATA[编译器不检查虚函数的各类属性:pub,pro,pri。统一放于虚函数表
继承属性只能改变子类继承下来的元素在子类中的属性，而即使是pri继承子类同样可以访问基类继承下来的prompub属性成员
析构的异常处理1：try catch record abort ,2：close +flag + try catch
基类析构,构造别用子类的虚函数（会被解释为基类的虚函数），可以通过子类静态非虚类函数构造基类
operator= 自赋值 return *this,new temp/copy-and-swap
co.]]></description><category></category></item><item><title><![CDATA[linux 小工具]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/107335130</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/107335130</guid><author>adlatereturn</author><pubDate>Sun, 02 Aug 2020 22:41:03 +0800</pubDate><description><![CDATA[可用来检验内存泄漏出处
valgrind --tool=memcheck --leak-check=full ./test
adl@adl:~/桌面/json-tutorial/tutorial03/images$ valgrind  ./leptjson_test --leak-check=full
==7458== Memcheck, a memory error detector
==7458== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Se]]></description><category></category></item><item><title><![CDATA[mychatroom聊天室坑点简要分析]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/107286812</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/107286812</guid><author>adlatereturn</author><pubDate>Mon, 27 Jul 2020 17:56:23 +0800</pubDate><description><![CDATA[需求[服务器日志]
emm，这个我就直接把服务器标准输出和错误重定向到文件里,由于函数太多，并没有在每个函数都去打印一句。
主要要设置无缓冲
    setbuf(stdout,NULL);
    setbuf(stderr,NULL);

主服务器流程
main注册服务器日志初始化套接字,epoll收取客户消息
主客户端流程
mainB初始化套接字登录注册退出找回密码 重新设置密码欢迎界面

...]]></description><category></category></item><item><title><![CDATA[linux 定时器(c++)(2)时间轮]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/107585630</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/107585630</guid><author>adlatereturn</author><pubDate>Sun, 26 Jul 2020 13:23:50 +0800</pubDate><description><![CDATA[节点类
相比较时间升序链表中的绝对时间expire
tw_timer采用的是相对时间的概念也就多出
rotation ，time_slot俩属性，rotation是转的“圈数”，time_slot是转到时间轮的哪一块区域。好比现在在1：05，过了65分钟时针走了闹钟的1rotation并走到10 time_slot;
tw_timer.h
//
// Created by adl on 2020/7/22.
//

#ifndef TEST2_TW_TIMER_H
#define TEST2_TW_TIME]]></description><category></category></item><item><title><![CDATA[linux 定时器（c++）时间升序链表]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/107586703</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/107586703</guid><author>adlatereturn</author><pubDate>Sat, 25 Jul 2020 23:02:19 +0800</pubDate><description><![CDATA[刚好前两天学长给我们讲座中提到服务器客户的超时处理，刚好又在看《高性能linx服务器编程》有发现这方面的知识，就拿出来总结一下。
第一,我们为什么需要自制计时器，c++ /c 的alarm不是可以实现定时操作吗，还有sleep…???
linux下一个进程共享一个alarm闹钟定时器，然而服务器肯定是多用户的，我们肯定得想方法给每个客户整一个定时器
升序时间链表
util_timer类代表着每一个节点，利用time()存储绝对时间,client_data是用户的数据
util_timer.h
//
// C]]></description><category></category></item><item><title><![CDATA[俄罗斯方块c++linux版本]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/107445014</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/107445014</guid><author>adlatereturn</author><pubDate>Sun, 19 Jul 2020 15:01:45 +0800</pubDate><description><![CDATA[主程序
RussiaBlock.cpp
//
// Created by adl on 2020/7/18.
//
#include "Block.h"
#include "Table.h"
#include &lt;thread&gt;
#include &lt;mutex&gt;
#include "hierarchical_mutex.h"
#include "fstream"

using namespace std;
thread_local uint64_t
        hierarchic]]></description><category></category></item><item><title><![CDATA[c-mysql(常用)]]></title><link>https://blog.youkuaiyun.com/adlatereturn/article/details/107281562</link><guid>https://blog.youkuaiyun.com/adlatereturn/article/details/107281562</guid><author>adlatereturn</author><pubDate>Sat, 11 Jul 2020 15:22:11 +0800</pubDate><description><![CDATA[MySQL C API 使用（基本函数）
了解了以上基础知识，去包装一些函数用来给c使用
accept_mysql 用来连接数据库
MYSQL   accept_mysql()
{
    MYSQL   mysql;
    if(NULL==mysql_init(&amp;mysql)){
        err_sys("mysql_init err",__LINE__);
    }
    if(mysql_library_init(0,NULL,NULL)!=0){
        err_sy]]></description><category></category></item></channel></rss>