muduo库-网络库概括 muduo库-网络库概括 网络事件的处理模式 服务器编程中,通常有两种高效的事件处理模式:reactor模式,proactor模式。 Reactor模式 要求主线程(I/O单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元)。除此之外,主线程不做其他任何实质性的工作。读写数据,接受新连接,以及处理客户请求均在工作线程中完成。 使用同步I/O模型(以epoll为例 2023-07-02 C++ > muduo #C++ #muduo
Cmake的使用 Cmake的使用 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 编译一个独立的cpp文件 文件结构如下: 123singleFile/| -- CMakeLists.txt| -- helloWorld.cpp CMakeLi 2023-07-01 #C++
muduo库-日志类 muduo库-日志类 muduo库中的日志为诊断日志,用于将代码运行时的重要信息进行保存,方便故障诊断和追踪。日志通常分为如下两种: 同步日志:当需要写出一条日志消息时,只有等到这条日志消息完全写出时才能执行后续的程序,其问题在于可能会阻塞在磁盘写操作上; 异步日志:当需要写日志消息时,只是将日志消息进行存储,当积累到一定量时或者达到时间间隔后,由后台线程自动将存储的所有日志进行数据; 综上所 2023-06-29 C++ > muduo #C++ #muduo
muduo库-ThreadLocalSingleton类 muduo库-ThreadLocalSingleton类 ThreadLocalSingleton类图如下: ThreadLocalSingleton 类封装为了线程本地存储单例类。在 Signleton 中提到过,常见的单例模式设计分为四种: 懒汉式 双检锁 饿汉式 局部静态式 ThreadLocalSingleton 类则采用了懒汉式的构建方法,而且由于是线程本地存储,则无需互斥锁来保证 2023-06-28 C++ > muduo #C++ #muduo
muduo库-Threadlocal类 muduo库-Threadlocal类 首先来看一个概念:线程特定数据 在单线程程序中,我们经常用全局变量共享数据。多线程环境下,全部变量被所有线程所共有。但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效。POSIX线程库通过维护一定的数据结构来解决这个问题,这些数据称之为线程特定数据(Thread-specific Data,或TSD)。对于POD类型,可以用__thread 2023-06-27 C++ > muduo #C++ #muduo
muduo库-Singleton类 muduo库-Singleton类 Singleton类的实现 常见的单例模式实现主要分为以下几种: 懒汉式 懒汉式要求先声明单例对象,然后在调用时才完成实例化操作。 123456789101112131415161718192021class Signleton {public: static Signleton* getInstance() { if (instan 2023-06-27 C++ > muduo #C++ #muduo
muduo库-BlockingQueue和BounderBlockingQueue muduo库-BlockingQueue和BounderBlockingQueue 无界阻塞队列 BlockingQueue muduo库的BlcokingQueue实际上用的生产这消费者模型。我们知道生产者消费者模型一般有两种实现方式,可以利用信号量也可以利用条件变量实现,muduo库采用条件变量实现。 BlockingQueue比较简单,它是线程安全的,我们在外部调用它时无需加锁。 Block 2023-06-26 C++ > muduo #C++ #muduo
muduo库-ThreadPool类 muduo库-ThreadPool类 线程池模型 模型图如下: 这个是通用线程池,双端队列存放的是多个可调用对象(即用户任务),而非函数指针,因此可以通过std::bind配接器传参。双端队列queue_,有时也称为工作队列。 工作原理:首先创建并启动一组线程,称为线程池threads_,由用户指定其大小maxQueueSize_,每个元素对对应一个线程。每个线程函数都是一样的,在其中会运行一个 2023-06-26 C++ > muduo #C++ #muduo
muduo库-线程同步CountDownLatch/Condition muduo库-线程同步CountDownLatch/Condition 多线程同步中的问题 多线程环境中,常有这样一种同步情况:一个线程等待其他所有线程完成指定工作。比如,在开启一个新线程后,虽然已经启动线程函数,很可能还有一些准备工作需要完成(如更新当前线程id,名称等信息),这样,调用线程(创建线程的线程)并不能马上投入工作,立即向新线程传递数据,可能造成未定义行为,如调用线程的某段代码依赖于 2023-06-26 C++ > muduo #C++ #muduo
Cpp-lambda递归调用的问题 Cpp-lambda递归调用的问题 今天写了一个lambda函数: 123456789function<bool(TreeNode*, long long, long long)> isBST = [](TreeNode* root, long long lower, long long upper){ if(!root) return true; 2023-06-26 C++ #C++