<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_22473333的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_22473333</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_22473333]]></copyright><item><title><![CDATA[muduo库学习之设计与实现01——什么都不做的EventLoop]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113624960</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113624960</guid><author>qq_22473333</author><pubDate>Thu, 04 Feb 2021 11:48:42 +0800</pubDate><description><![CDATA[东阳的学习笔记

文章目录一. 基本接口1.1 构造函数1.2 loop成员函数二、工具函数2.1 getEventLoopOfCurrentThread()2.2 void EventLoop::abortNotInLoopThread
一. 基本接口


构造函数、析构函数、loop() 成员函数
EventLoop是不可拷贝的
muduo中大多数类都是不可拷贝的。

class EventLoop : boost::noncopyable
{
public:

 EventLoop();
 ~Eve.]]></description><category></category></item><item><title><![CDATA[linux惊群效应]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113617083</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113617083</guid><author>qq_22473333</author><pubDate>Wed, 03 Feb 2021 18:55:53 +0800</pubDate><description><![CDATA[原文连接：https://xiaomaweifu.blog.youkuaiyun.com/article/details/78648798

linux惊群效应
详细的介绍什么是惊群，惊群在线程和进程中的具体表现，惊群的系统消耗和惊群的处理方法。
1、惊群效应是什么？

惊群效应也有人叫做雷鸣群体效应，不过叫什么，简言之，惊群现象就是多进程（多线程）在同时阻塞等待同一个事件的时候（休眠状态），如果等待的这个事件发生，那么他就会唤醒等待的所有进程（或者线程），但是最终却只可能有一个进程（线程）获得这个时间的“控制权”，.]]></description><category></category></item><item><title><![CDATA[muduo库学习之详解muduo多线程模型（常见的并发网络服务器设计方案）]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113547285</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113547285</guid><author>qq_22473333</author><pubDate>Wed, 03 Feb 2021 17:16:09 +0800</pubDate><description><![CDATA[东阳的学习笔记

12种常见方案
下表是作者总结的12种常见方案，其中：

互通：开发chat服务时，多个客户连接之间是否能方便地交换数据


]]></description><category></category></item><item><title><![CDATA[muduo库学习之C++多线程系统编程精要07——多线程与 fork、多线程与signal]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113530156</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113530156</guid><author>qq_22473333</author><pubDate>Tue, 02 Feb 2021 09:20:46 +0800</pubDate><description><![CDATA[东阳的学习笔记

1. 多线程与 fork
多线程与 fork() 的协作性很差。这是 POSIX 系列操作系统的历史包袱。
1.1 fork 一般不能在多线程程序中使用
因为 Linux 的 fork() 只克隆当前线程的 thread of control，不克隆其他线程。fork() 之后，除了当前线程之外的所有线程都消失了。

forkall() 是很难办到的。因为其他线程可能等在 condition variable 上面，可能阻塞在系统调用上、可能等着 metux 以进入临界区

1.2 fo.]]></description><category></category></item><item><title><![CDATA[muduo库学习之C++多线程系统编程精要06——RAII与fork]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113529880</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113529880</guid><author>qq_22473333</author><pubDate>Tue, 02 Feb 2021 09:20:25 +0800</pubDate><description><![CDATA[东阳的学习笔记


审慎使用 fork()

fork()可能会导致资源泄漏
但是，假如程序会fork()，上面的假设就会被破坏了
考虑下面这个例子，Foo对象构造了一次，但是析构了两次
int main()
{
    Foo foo;    //调用构造函数
    fork();     //fork为两个进程
    foo.doit(); //在父子进程中都使用foo
 
    //析构函数会被调用两次，父进程和子进程各一次
}


还可能会出现的错误：如果Foo class封装了某种资源，而.]]></description><category></category></item><item><title><![CDATA[muduo库学习之C++多线程系统编程精要05——用RAII包装文件描述符]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113529446</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113529446</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 21:16:25 +0800</pubDate><description><![CDATA[东阳的学习笔记

POSIX分配文件描述符的方式容易串话
因为 POSIX 标准要求每次打开新文件（含socket）的时候，必须使用当前最小可用的文件描述符号码。这样可能导致串话。
多线程程序如何避免串话
在单线程程序中，可以通过某种全局表来避免串话。但是这种方法显然不适合多线程场景！
在C++中，要解决串话问题，很简单：RAII。只需要将文件描述符对象包装在 Socket 对象中。在析构函数里关闭文件描述符即可。
服务器程序中不应该关闭标准输出和标准错误

因为有些第三方库会在紧急情况下往  stdou.]]></description><category></category></item><item><title><![CDATA[muduo库学习之C++多线程系统编程精要04——多线程与IO]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113528787</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113528787</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 20:45:17 +0800</pubDate><description><![CDATA[东阳的学习笔记

在进行多线程网络编程的时候，几个自然的问题是：

如何处理IO？（一个文件只由一个进程中的一个线程来读写，这种做法显然是正确的）
能否多个线程同时读写同一个 socket 文件描述符？（最好不要）
我们知道用多线程同时处理多个 socket 通常可以提高效率，那么处理同一个 socket 呢？

系统调用时线程安全的，但是使用不是线程安全的


首先，**操作文件描述符的系统调用本身是线程安全的，**我们不用担心多个线程同时操作文件描述符会造成进程崩溃或内核崩溃


但是，
多个线程同时.]]></description><category></category></item><item><title><![CDATA[muduo库学习之C++多线程系统编程精要03——线程的创建与销毁]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113523357</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113523357</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 16:47:59 +0800</pubDate><description><![CDATA[东阳的学习笔记

线程的创建
线程的创建比销毁要容易得多，只需要遵守下面几条原则即可：

程序库不应该在未提前告知的情况下创建自己的“背景线程”
尽量用相同的方式创建线程，例如muduo::Thread
在进入main()函数之前不应该启动线程
程序中线程的创建最好能在初始化阶段全部完成

1. 程序库不应该在未提前告知的情况下创建自己的“背景线程”

线程是稀缺资源，如果程序库暗地里使用了线程，可能会导致高估系统的可用资源。
一旦程序中有不只一个线程就很难安全的 fork，因此程序库最好不要偷偷使用线程.]]></description><category></category></item><item><title><![CDATA[muduo库学习之C++多线程系统编程精要02——C/C++系统库的线程安全性]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113521786</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113521786</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 15:58:33 +0800</pubDate><description><![CDATA[一、C/C++的线程库

原先的C/C++标准（C89/C99/C++03）并没有涉及线程，新版的C/C++标准（C11和C++11）规定了程序在多线程下的语意，C++11还定义了一个线程库（std::thread）


内存模型（memory model）

对于标准而言，关键的不是定义线程库，而是规定内存模型
特别是规定一个线程对某个共享变量的修改何时能被其他线程看到，这称为内存序（memory ordering）或者内存能见度 （memory visibility）
从理论上讲，如果没有合适的内存模型]]></description><category></category></item><item><title><![CDATA[muduo库学习之C++多线程系统编程精要01——基本线程原语的选用、Linux上的线程标识、善用__thread关键字、Linux新增系统调用的启示]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113519156</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113519156</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 15:44:35 +0800</pubDate><description><![CDATA[东阳的学习笔记

学习多线程面临的最大的思维转变有两点：

当前线程可能随时会被切出去，或者说被抢占了。
多线程程序中事件的发生顺序不再有全局统一的先后关系


多线程程序的正确性不能依赖于任何一个线程的执行速度，不能通过原地等待（sleep）来假定其他线程的事件已经发生，而必须通过适当的同步来让当前线程能够看到其他线程事件的结果。无论线程执行得快与慢（被操作系统切换出去的越多执行地越慢）， 程序都应该能够正常工作。`

一、基本线程原语的选用


我认为用C/C++编写跨平台（只针对POSIX操作系统）.]]></description><category></category></item><item><title><![CDATA[muduo库学习之多线程服务器的适用场合]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113515020</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113515020</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 14:33:07 +0800</pubDate><description><![CDATA[文章目录正名必须用单线程的场合基于进程的分布式系统设计单线程程序的优势多线程程序有性能优势吗？适用多线程程序的场景线程的分类
“服务器开发”包罗万象，本文所指的“服务器开发”的含义请见《常用模型》一文，一句话形容是：跑在多核机器上的 Linux 用户态的没有用户界面的长期运行的网络应用程序。“长期运行”的意思不是指程序 7x24 不重启，而是程序不会因为无事可做而退出，它会等着下一个请求的到来。例如 wget 不是长期运行的，httpd 是长期运行的。
正名
与前文相同，本文的“进程”指的是 fork() ]]></description><category></category></item><item><title><![CDATA[muduo库学习之常用编程模型04——常用编程模型与进程间通信方式的选择]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113510924</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113510924</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 14:04:51 +0800</pubDate><description><![CDATA[东阳的学习笔记

文章目录1. 单线程服务器常用地编程模型2. 典型的多线程服务器的线程模型One loop per thread线程池归纳3. 进程间通信与线程间通信进程间通信

原文链接：https://blog.youkuaiyun.com/yuyin86/article/details/7086424

1. 单线程服务器常用地编程模型

常用的单线程编程模型见https://blog.youkuaiyun.com/qq_22473333/article/details/112910686

在高性能的网络程序中，使用得.]]></description><category></category></item><item><title><![CDATA[muduo库学习之适用场合和常用编程模型03——进程和线程]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113508954</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113508954</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 12:49:17 +0800</pubDate><description><![CDATA[东阳的学习笔记

进程和线程

每个进程有自己的独立空间。“在同一个进程” 还是 “不在同一个进程”是系统功能划分的重要决策点。
线程的特点是共享地址空间，从而高效地共享数据，一台机器上的多个进程能高效地共享代码段（操作系统可以映射为同样的物理内存），但不能共享数据。如果多个进程大量地共享内存，等于是把多进程程序当作多线程来写，掩耳盗铃！

为什么要使用多线程

作者认为是为了更好地发挥多核处理器的效能。如果只有一块CPU、一个执行单元，按状态机的思路去写程序是最高效的。


...]]></description><category></category></item><item><title><![CDATA[muduo库学习之适用场合和常用编程模型02——线程]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113506147</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113506147</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 11:59:40 +0800</pubDate><description><![CDATA[原文链接：https://blog.youkuaiyun.com/zhoucheng05_13/article/details/97612135

1 线程创建
创建一个线程，并在主线程和子线程中打印进程id、线程id。
实例代码
#include "apue.h"
#include&lt;pthread.h&gt;

pthread_t tdno;

//打印进程id、线程id
void printids(const char* s){
    pid_t pid;
    pthread_t tid;

    .]]></description><category></category></item><item><title><![CDATA[muduo库学习之适用场合和常用编程模型01——fork函数（多进程）]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113481494</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113481494</guid><author>qq_22473333</author><pubDate>Mon, 01 Feb 2021 11:24:24 +0800</pubDate><description><![CDATA[东阳的学习笔记


]]></description><category></category></item><item><title><![CDATA[muduo库学习之线程同步08——总结]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113480871</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113480871</guid><author>qq_22473333</author><pubDate>Sun, 31 Jan 2021 16:40:40 +0800</pubDate><description><![CDATA[东阳的学习笔记

1. 内容总结
前面几篇文章的内容归纳如下：

线程同步的四项原则，尽量使用高层同步设施（线程池、队列、倒计时）
使用普通互斥器和条件变量完成剩余的同步任务，采用 RAII惯用手法和 Scoped Locking。


所谓的四项原则即：
muduo库学习之线程同步01——互斥器mutex中所提到的使用原则

2. 文章汇总
muduo库学习之线程同步01——互斥器mutex
muduo库学习之线程同步02——条件变量
muduo库学习之线程同步03——不要用读写锁和信号量
muduo库.]]></description><category></category></item><item><title><![CDATA[muduo库学习之线程同步07——CopyOnWrite]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113477269</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113477269</guid><author>qq_22473333</author><pubDate>Sun, 31 Jan 2021 16:16:50 +0800</pubDate><description><![CDATA[东阳的学习笔记

CopyOnWriter
1 什么是COW?
COW字面意思写时复制，是一种并发场景下的共享数据策略。
顾名思义，它的基本思想是大家共享同一份数据，读的时候不加锁，直接读取数据；更新数据时在其拷贝副本上操作，在这个新拷贝的数据上演绎更新操作，然后再用这个新数据替换老数据。
2 借 shared_ptr 实现 copy-on-write
在 互斥器 那篇文章中提到了一个死锁的例子。在这里我们来看看如何使用 COW 来解决这个问题：

先将数据结构改成：

typedef std::vect.]]></description><category></category></item><item><title><![CDATA[muduo库学习之线程同步06——Singleton单例实现]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113443245</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113443245</guid><author>qq_22473333</author><pubDate>Sat, 30 Jan 2021 17:34:37 +0800</pubDate><description><![CDATA[文章目录一、DCL二、pthread_once
原文链接：https://blog.youkuaiyun.com/qq_41453285/article/details/104885869
一、DCL


研究Singleton的线程安全实现的历史会发现很多有意思的事情，人们一度认为double checked locking（缩写为DCL）是王道，兼顾了效率与正确性。后来有“神牛”指出由于乱序执行的影响，
DCL是靠不住的
。可以参阅：

http://www.cs.umd.edu/~pugh/java/memory]]></description><category></category></item><item><title><![CDATA[muduo库学习之线程同步05——MutexLock、MutexLockGuard的封装]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113442334</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113442334</guid><author>qq_22473333</author><pubDate>Sat, 30 Jan 2021 17:27:15 +0800</pubDate><description><![CDATA[文章目录一、MutexLock、MutexLockGuard的封装MutexLockMutexLockGuard二、Condition的封装&gt;Condition关于条件变量与互斥器的使用三、总结
一、MutexLock、MutexLockGuard的封装


MutexLock：
封装临界区（critical section），这是一个简单的资源类，用RAII手法封装互斥器的创建与销毁。MutexLock一般是别的class的数据成员

临界区在Windows上是struct CRITICAL_SEC]]></description><category></category></item><item><title><![CDATA[muduo库学习之线程同步04——sleep不是同步原语]]></title><link>https://blog.youkuaiyun.com/qq_22473333/article/details/113441566</link><guid>https://blog.youkuaiyun.com/qq_22473333/article/details/113441566</guid><author>qq_22473333</author><pubDate>Sat, 30 Jan 2021 17:11:30 +0800</pubDate><description><![CDATA[东阳的学习笔记


我认为sleep()/usleep()/nanosleep()只能出现在测试代码中，比如写单元测试的时候（备注：设计时间的单元测试不那么好写，短的如一两秒可以用sleep()；长的如一小时、一天，则得想其他办法，比如把算法提取出来并把时间注入进去）
或者用于有意延长临界区，加速复现死锁的情况，就像“前文介绍的死锁”示范的那样
sleep不具备memory barrier语义，它不能保证内存的可见性（参阅后面“C++多线程系统编程精要”的文章最开始的例子）

生产代码中线程的等待可分为两.]]></description><category></category></item></channel></rss>