摘要: 对于*pai=120这种方式属于未定义行为,尽量不要这么干(因为原来是一个常量) 阅读全文
posted @ 2021-10-16 13:20 wsq1219 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 左值引用,就是绑定到左值的引用,通过&来获得左值引用。那么,什么是左值呢?左值,就是在内存有确定存储地址、有变量名,表达式结束依然存在的值。 std::move 可以把左值转换成右值,没有移动能力 string里的移动构造函数清空st 阅读全文
posted @ 2021-10-08 15:06 wsq1219 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 后置返回类型 内联函数 内联函数需要的是函数本体 优缺点:代码量应该尽量的少,避免代码膨胀 constexpr函数也可以看成是更严格的一种内联函数 这样可以吗? 阅读全文
posted @ 2021-10-07 19:59 wsq1219 阅读(33) 评论(0) 推荐(0) 编辑
摘要: 信号量相当于加强版的互斥锁 mutex实现的同步是串行的,既能提供进程间的同步,还能提供线程间的同步 /* 信号量的类型 sem_t int sem_init(sem_t *sem, int pshared, unsigned int value); - 初始化信号量 - 参数: - sem : 信 阅读全文
posted @ 2021-09-30 00:41 wsq1219 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 生产者消费者模型(简略) //效率不高,引入条件变量 #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h> // 创建一个互斥量 pthread_mutex_t mutex; struct No 阅读全文
posted @ 2021-09-28 22:00 wsq1219 阅读(59) 评论(0) 推荐(0) 编辑
摘要: 造成死锁的原因:1.重复上锁(自己锁自己) 2.没有解锁 死锁的几种场景:忘记释放锁重复加锁多线程多锁,抢占锁资源 读写锁 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但 阅读全文
posted @ 2021-09-27 21:16 wsq1219 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 原子操作是不被打断的操作,即它是最小的执行单位 通过加锁,可实现原子操作 阅读全文
posted @ 2021-09-27 18:18 wsq1219 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。 原子操作 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存 阅读全文
posted @ 2021-09-27 18:12 wsq1219 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 服务器程序通常需要处理三类事件:I/O 事件、信号及定时事件。有两种高效的事件处理模式:Reactor和 Proactor,同步 I/O 模型通常用于实现 Reactor 模式,异步 I/O 模型通常用于实现 Proactor 模式。 Reactor 要求主线程(I/O处理单元)只负责监听文件描述符 阅读全文
posted @ 2021-09-24 13:34 wsq1219 阅读(123) 评论(0) 推荐(0) 编辑
摘要: socket是套接字,通过套接字,进行网络数据的收和发套接字就像网络中的“手机” 套接字是网络数据传输用的软件设备 errno获得出现的错误 既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux 系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作 阅读全文
posted @ 2021-09-24 01:06 wsq1219 阅读(42) 评论(0) 推荐(0) 编辑