epoll 中的边缘触发 ET 和水平触发 LT 模式
epoll 中的触发模式有两种,边缘触发和水平触发,默认情况下使用的是水平触发。 边缘触发 (ET) 的意思是当电平出现变化的时候才触发事件,如果设置了边缘触发,执行 epoll_wait 时,内核检测到数据到达后立马返回到应用层。但是这仅仅只返回这一次,如果缓冲区中的数据没有读取完,再次执行 epoll_wa ... 阅读更多
epoll 中的触发模式有两种,边缘触发和水平触发,默认情况下使用的是水平触发。 边缘触发 (ET) 的意思是当电平出现变化的时候才触发事件,如果设置了边缘触发,执行 epoll_wait 时,内核检测到数据到达后立马返回到应用层。但是这仅仅只返回这一次,如果缓冲区中的数据没有读取完,再次执行 epoll_wa ... 阅读更多
一、猴子拿苹果问题 逛脉脉时,看到一网友遇到的面试题:有 9 个苹果,2 只猴子。一个猴子每次拿 2 个苹果,一个猴子每次拿 3 个苹果。如果剩余的苹果数量不够猴子拿的数量,则停止拿苹果。请用多线程的方式模拟上面的描述。 看到问题的第一眼,觉得很有趣,脑海中第一个想到的就是通过信号量来实现,因为信号量是最适合做线 ... 阅读更多
共享内存是所有 IPC 通信中效率最高的,它通过把文件映射到用户进程空间,然后直接通过地址访问来实现多进程通信。相对于其他 IPC 通信方式而言,少去了把数据从用户空间复制到内核空间,再从内核空间复制到用户空间的过程,因此效率相当高。 用图形来表示就是: 操作共享内存的函数: [crayon-6946825 ... 阅读更多
EAGAIN 和 EWOULDBLOCK 是 linux 环境下的两个错误码,在非阻塞 IO 中经常会碰到,对新手而言,如何处理这两个值非常头疼。如果处理不当,很容易导致程序异常。 EAGAIN 的官方定义: 「Resource temporarily unavailable.」 The call might wo ... 阅读更多
往 vector 中添加元素时,如果空间不够将会导致扩容。 vector 有两个属性:size 和 capacity 。 size 表示已经使用的数据容量,capacity 表示数组的实际容量,包含已使用的和未使用的。 vector 扩容规则: 当数组大小不够容纳新增元素时,开辟更大的内存空间,把旧空间上的数据复制过来, ... 阅读更多
一、迭代器失效 向容器添加或者删除元素可能会导致指向容器的指针、引用或者迭代器失效。使用已经失效的指针、引用或者迭代器将会导致程序出现异常,编码过程中一定要时刻注意迭代器失效的场景。 例如,以 vector 为例:
|
1 2 3 4 5 6 7 8 9 10 |
int main() { vector<int> v{1, 2}; vector<int>::iterator it; for (it = v.begin(); it != v.end(); it++) { v.push_back(*it); } return 0; } |
执行以上代码会导致段错 ... 阅读更多
一、友元 友元可以允许其他类或者函数访问自己的非共有成员,如果类想把它的函数作为友元,只需要增加一条以 friend 开头的函数声明即可。 1.1 添加外部函数作为友元 以下一个学生类,类中保存了学生的年龄、名字以及性别信息:
|
1 2 3 4 5 6 |
class stu_st { private: int age; string name; char sex; }; |
现在希望在 ... 阅读更多
c++中,调用 c 语言函数时要对函数添加声明 extern "C",这是因为 c 和 c++的符号表机制不一样导致的。 假设存在函数 fun,经过 gcc 编译后,该函数在符号表中的名字是 fun,但是经过 g++编译后,该函数在符号表中的结果是 xxfunxx,c++编译器会在函数两侧加上一些随机字符。因为两者的编译结 ... 阅读更多
一、 class 和 struct 的区别 C++中 class 和 struct 的区别: 继承权限,struct 的默认继承权限为 public,class 的默认继承权限为 private 。 访问权限,struct 的默认访问权限为 public,class 的默认访问权限为 private 。 网上还流传着其他一些的区别,但 ... 阅读更多
区别: 指针是一个变量类型,引用只是一个变量别名。 指针可以不用初始化,引用必须初始化。 指针可以指向空地址,引用不能指向空。 指针初始化后可以修改,引用不能修改。 其他: 引用本质上也是一个指针,内部实现是一个常量指针。 C++中一般建议使用引用,不要使用指针。函数传值建议使用 const 引用。