TinyWebServer pool
pool包括了sql连接池和执行任务的线程池。 SqlConnRAII这里使用RAII来管理和获取pool池资源,使得在构造时获取资源,在析构时释放资源。 12345678910111213141516171819202122232425262728#ifndef SQLCONNRAII_H#define SQLCONNRAII_H#include "sqlconnpool.h"#include <cassert>#include <mysql/mysql.h>class SqlConnRAII {public: SqlConnRAII(MYSQL **sql, SqlConnPool *connPool) { assert(connPool); //不能直接将指针赋值给另一个指针,因为指针本身就是一个值,而不是一个引用。 *sql = connPool->GetConn(); sql_ = *sql; connpool_ = connPool; } ...
TinyWebServer Log
Log日志系统是各大项目的基石,可以帮我们进行调试、错误定位。当然,看着日志系统产生一行行输出也是一种享受。 今天发现代码补全有点问题,经过一番搜索,发现在wsl2上使用clangd比自带的补全强多了,强推(虽然最后发现是模板写错了)! 阻塞队列 同步变量: 线程在某些条件得到满足之前挂起 notify_one:随机选择一个线程唤醒。 notify_all:唤醒所有在条件变量上等待的线程,可能会引起惊群效应。 互斥锁:防止多个线程同时访问共享资源。 C++11多线程之互斥量(mutex)与条件变量(condition_variable)_c++ 条件变量和互斥-CSDN博客 生产者消费者模型:生产者线程通过 push_back 和 push_front 向队列中添加元素,消费者线程通过 pop...
TinyWebServer概述
TinyWebServer趁着刚看完effectiveCpp,赶紧过来写个小项目,TinyWebServer作为众多Cpp后端开发者的项目,值得入门学习(PS:虽然现在cpp后端已经很少了)。但是我们仍然可以从该项目中学到c++项目体系结构,其中log类、连接池、缓冲区也是与其他cpp项目也有共通之处,当然网络编程的知识也是可以从中学到许多。 由于我电脑配置有点较低(主要是轻薄本内存不太够),而且这里我使用的是wsl2+vscode的组合,ps:听说大厂都是远程开发。 开始时间2024/5/1,预计完成时间2024/5/14。 2024/5/1 ~ 2024/5/2 完成Buffer 2024/5/3 ~ 2024/5/4 完成log 2024/5/4 ~ 2024/5/5 完成pool 2024/5/5 完成heap 2024/5/6 ~ 2024/5/10 完成 http 2024/5/12 ~ 2024/5/12 完成 webserver 2024/5/13 ~ 2024/5/14...
EffectiveCpp0x6
Customizing new and delete[toc] Understande the behavior of the new-handler.当operator new无法满足内存分配需求时,会抛出异常,用户可以通过调用set_new_handler来设置异常处理函数。 MSVC声明: 12_EXPORT_STD using new_handler = void(__CLRCALL_PURE_OR_CDECL*)();_EXPORT_STD extern "C++" _CRTIMP2 new_handler __cdecl set_new_handler(_In_opt_ new_handler) noexcept; 这段代码定义了new_handler类型为函数指针,并声明了set_new_handler函数,noexcept,表示不抛出异常 set_new_handler的参数是个指针,指向operator new无法分配足够内存时该被调用的函数。其返回值也是个指针,指向set_new_handler...
洛谷题单——数组
[toc] P1428 小鱼比可爱 12345678910111213141516171819202122#include <iostream>const int N = 105;int a[N];using namespace std;int main(){ int n; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) { int count = 0; for (int j = 0; j < i; j++) { if (a[i] > a[j]) count++; } cout << count << " "; }} P1427 小鱼的数字游戏 看到的优秀题解,方便你快速过一遍知识:一个红题带你了解绿(黄)题知识点 - 洛谷专栏...
EffectiveCpp0x6
Templates and Generic ProgrammingC++ template 机制自身是一部完整的图灵机C Turing-complete) :它可以被用来计算任何可计算的值。于是导出了模板元编程(template metaprogramming) ,创造出“在C++编译器内执行并于编译完成时停止执行”的程序。 [toc] 41. Understand implicit interfaces and compile-time polymorphism.面向对象编程世界总是以显式接口(explicit interfaces) 和运行期多态(runtime polymorphism)解决问题。 模板反倒是反倒是隐式接口(implicit interfaces)和编译期多态(compile-time polymorphism)移到前头了。 来看以下例子: 12345678910class Widget {public: Widget(); virtual ~Widget(); virtual std::size_t size() const; ...
EffectiveCpp0x6
Inheritance and Object-Oriented Design[toc] 我:请问什么是面向对象原则 ChatGPT:SOLID 是面向对象设计中的五个基本设计原则的首字母缩写,它们是: 单一职责原则(Single Responsibility Principle,SRP): 每个类或模块应该只有一个改变的理由,即一个类应该只负责一个职责。这个原则指导我们将系统分解为小而独立的部分,每个部分都有自己的职责,使得代码更加清晰、可维护和可重用。 开放-封闭原则(Open/Closed Principle,OCP): 软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着当需要改变系统的行为时,不应该修改已有的代码,而是应该通过扩展现有的代码来实现新的行为。这个原则鼓励使用抽象和多态性来实现系统的灵活性和可扩展性。 里氏替换原则(Liskov Substitution Principle,LSP):...
EffectiveCpp0x5
Implementation[toc] 26. Postpone variable definitions as long as possible.只要你定义了一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流(control flow) 到达这个变量定义式时,你便得承受构造成本;当这个变量离开其作用域时,你便得承受析构成本。即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽可能避免这种情形。 考虑一个加密函数当抛出一个异常时(如加密字符串长度过短),则该encrypted字符串将未被使用: 1234567891011121314// this function defines the variable "encrypted" too soonstd::string encryptPassword(const std::string& password){ using namespace std; string encrypted; if (password.length() <...
EffectiveCpp0x4
[toc] Designs and Declarations18. Make interfaces easy to use correctly and hard to use incorrectly 欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误。 类型系统是我们的同盟国 通过一下设计可以避免由于不同国家日期表示方式的区别而产生的错误。 1234567891011121314151617struct Day { struct Month { struct Year { explicit Day(int d) explicit Month(int m) explicit Year(int y) :val(d) {} :val(m) {} :val(y){} int val; ...