摘要: POSIX线程函数一共有110多个,常用的不过十几个。贵精不贵多。这11个最基本的Pthread函数是: 2个:线程的创建和等待结束(join)。 4个:mutex的创建、销毁、加锁、解锁。 5个:条件变量的创建、销毁、等待、通知、广播。 用这三类东西(thread、mutex、condition) 阅读全文
posted @ 2018-03-11 23:02 guhowo 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 一、定义 教科书式回答,进程是资源分配的最小单位,而线程是CPU调度的最小单位。 进程有自己的独立地址空间(虚拟的,4G大小),一个进程崩溃后不会对其他进程产生影响。同一进程内的某一个线程崩溃后,整个进程也崩溃了。因为线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。 多进程比多线程程序要健 阅读全文
posted @ 2018-03-11 00:24 guhowo 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 配合多线程使用。 阅读全文
posted @ 2018-03-08 23:30 guhowo 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 先看一段代码: 运行结果如下,情理之中,意料之内: C++创建对象的时候先创建基类部分,然后创建派生部分。析构的时候要反过来了,先释放子类部分,然后在释放父类部分。但是这里只释放了父类部分,没有释放派生类的部分。为什么呢? 原因很明确:因为之类pB是基类指针,虽然指向的是派生类,只能调用自己的函数, 阅读全文
posted @ 2018-03-08 23:05 guhowo 阅读(9385) 评论(1) 推荐(1) 编辑
摘要: volatile只保证其“可见性”,不保证其“原子性”。 执行count++;这条语句由3条指令组成: (1)将 count 的值从内存加载到 cpu 的某个 寄存器r; (2)将 寄存器r 的值 +1,结果存放在 寄存器s; (3)将 寄存器s 中的值写回内存。 所以,如果有多个线程同时在执行 c 阅读全文
posted @ 2018-03-07 22:15 guhowo 阅读(2629) 评论(0) 推荐(0) 编辑
摘要: 困惑 首先,我知道select是IO复用。以UDP为例,select流程大体如下: 但是网上很多人都说这个框架使得服务端实现了并发。我很好奇的是,这个并发是怎么实现的? 因为select返回大于0后,开始检查read_fds,看是哪些FD已经可读。比如fd1和fd5可读了,我肯定先处理fd1的数据, 阅读全文
posted @ 2018-02-28 21:28 guhowo 阅读(304) 评论(0) 推荐(0) 编辑
摘要: C++的静态成员是和类关联的,它属于某个类,但是不属于某个特定的对象。静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 但是可以通过对象调用静态成员函数,虽然我们一般不会这么做: 在类外实现 阅读全文
posted @ 2018-02-26 22:28 guhowo 阅读(1875) 评论(0) 推荐(0) 编辑
摘要: 从成员函数说起 在说const成员函数之前,先说一下普通成员函数,其实每个成员函数都有一个隐形的入参:T *const this。 const成员函数 声明形式是:int getValue() const; 编译器内部实现如下 表示this指针指向的内容是不可改变的,所以当试图修改val时会编译报错 阅读全文
posted @ 2018-02-26 21:55 guhowo 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 只允许基础指针的一个所有者。 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr)。 替换已弃用的 auto_ptr。 相较于 boost::scoped_ptr。 unique_ptr 小巧高效;大小等同于一个指针,支持 rvalue 引用, 阅读全文
posted @ 2018-02-25 11:53 guhowo 阅读(1714) 评论(2) 推荐(1) 编辑
摘要: 0、异常安全 C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。 使用 raw pointer 管理动态内存时,经常会遇到这样的问题: 忘记delete内存,造成内 阅读全文
posted @ 2018-02-25 10:18 guhowo 阅读(13571) 评论(1) 推荐(1) 编辑
摘要: 深拷贝和浅拷贝 所谓“深拷贝”和“浅拷贝”,各自代表不同的意义,各有所需。主要要分清值语意和引用语意。 值语意:x=y完成复制后,得到的x完全独立于y, x的改变不会影响原来的y。 引用语意:x=y完成复制后,修改x会影响y,x,y某种程度上共享了一片内存空间,存在耦合的。如下: 所以拷贝,其实都是 阅读全文
posted @ 2018-02-11 19:56 guhowo 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 现象 工作中遇到一件怪事:搭建好服务器后(VPN服务器,创建了虚拟网卡),服务器和客户端之间响应正常且很稳定,客户端也能正常通过服务器访问外网。但是访问个别网站时可以打开文字,但是部分图片打不开(也不是所有图片打不开)。 分析 根据以上现象,基本排除了虚拟借口或者物理接口有问题,怀疑客户端和服务器之 阅读全文
posted @ 2018-02-01 22:47 guhowo 阅读(1127) 评论(0) 推荐(0) 编辑
摘要: explicit是C++中的一个关键字,只用于修饰只有一个参数的构造函数: 该关键字告诉编译器该类只能显式的转换,不能隐式(implicit)的赋值。下面介绍一下显式转换和隐式转换的区别: google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以以后想项目中我决 阅读全文
posted @ 2018-01-31 17:51 guhowo 阅读(464) 评论(0) 推荐(0) 编辑
摘要: C++: 1、vector的erase()实现,使用时注意事项,项目中遇到的bug。和remove的区别 2、vector swap()的用于修整空间?为什么不用clear(),因为clear()只是无法保证内存回收。 3、智能指针的用法shared_ptr,unique_ptr,weak_ptr 阅读全文
posted @ 2018-01-31 16:06 guhowo 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 同一进程中的不同线程间共享进程的全局变量、文件描述符。 线程或进程的同步方式:信号量和互斥量 临界区 线程/进程可以访问共享资源,但是有些资源同一时间只能一个线程访问,这种资源称为临界资源,如打印机等。此外,还有许多变量、数据等都可以被若干进程共享,也属于临界资源。访问临界资源必须互斥的进行,访问临 阅读全文
posted @ 2017-12-10 21:50 guhowo 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 问上述程序会打印出多少个"-",我当时认为是6个啊,这还用问?嗨。原来fork调用的时候已经把printf中的"-"放在缓存区中了,而且没有flush,即没有刷新缓冲区。所以父子进程各复制了一份"-",所以答案是8个。 下面这段代码: 执行./a.out,输出如下 a write to stdout 阅读全文
posted @ 2017-12-08 23:05 guhowo 阅读(314) 评论(0) 推荐(0) 编辑
摘要: ARP(Address Resolution Protocol)是地址解析协议 阅读全文
posted @ 2017-12-07 22:30 guhowo 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 概念 内核一旦发现进程指定的一个或者多个I/O条件就绪(也就是说输入已准备好被读取,或者描述符已能承受更多的输出),它就通知进程。这个能力称为I/O复用(I/O multiplexing)。 使用场景 当处理多个多个文件描述符或者监听多个socket时,必须使用I/O复用。 如果一个服务器要同时处理 阅读全文
posted @ 2017-12-02 23:26 guhowo 阅读(403) 评论(0) 推荐(0) 编辑
摘要: TCP协议是有连接且可靠的传输层协议。所以一切都是围绕面向连接和可靠展开的。 面向连接 连接的建立:三次握手,标志位的变化,及状态变化。发送端状态变化SYN_SENT-->ESTABLISHED;接收端状态变化Listen-->SYN_RCVD-->ESTABLISHED。 引入的问题:SYN_FL 阅读全文
posted @ 2017-11-27 22:02 guhowo 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 窗口探查(window probe) 当接收方TCP缓冲区没有剩余空间后,在ACK中会通知发送方window=0,此时发送方就暂停发送数据。当接收方TCP缓冲区又有空间后,会再次发送一个ACK,告知其剩余缓冲区大小,可以接受新的数据包了,这个ACK叫做窗口更新。TCP接收方则等待新的数据包过来。但是 阅读全文
posted @ 2017-11-25 21:45 guhowo 阅读(387) 评论(0) 推荐(0) 编辑