2018-9-19 烽火通信C++面经

烽火通信C++面经

多线程

https://www.cnblogs.com/lyjblogs/p/7888646.html
https://www.cnblogs.com/raichen/p/5766634.html
多线程就是多个线程并发执行

https://blog.csdn.net/qq_37010006/article/details/79402256
线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。

  1. 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱。在某一时刻,只有一个线程可以获取互斥锁,在释放互斥锁之前其他线程都不能获取该互斥锁。如果其他线程想要获取这个互斥锁,那么这个线程只能以阻塞方式进行等待。
  2. 条件锁就是所谓的条件变量,某一个线程因为某个条件为满足时可以使用条件变量使改程序处于阻塞状态。一旦条件满足以“信号量”的方式唤醒一个因为该条件而被阻塞的线程。最为常见就是在线程池中,起初没有任务时任务队列为空,此时线程池中的线程因为“任务队列为空”这个条件处于阻塞状态。一旦有任务进来,就会以信号量的方式唤醒一个线程来处理这个任务。这个过程中就使用到了条件变量pthread_cond_t。
  3. 假设我们有一个两个处理器core1和core2计算机,现在在这台计算机上运行的程序中有两个线程:T1和T2分别在处理器core1和core2上运行,两个线程之间共享着一个资源。
    首先我们说明互斥锁的工作原理,互斥锁是是一种sleep-waiting的锁。假设线程T1获取互斥锁并且正在core1上运行时,此时线程T2也想要获取互斥锁(pthread_mutex_lock),但是由于T1正在使用互斥锁使得T2被阻塞。当T2处于阻塞状态时,T2被放入到等待队列中去,处理器core2会去处理其他任务而不必一直等待(忙等)。也就是说处理器不会因为线程阻塞而空闲着,它去处理其他事务去了。
    而自旋锁就不同了,自旋锁是一种busy-waiting的锁。也就是说,如果T1正在使用自旋锁,而T2也去申请这个自旋锁,此时T2肯定得不到这个自旋锁。与互斥锁相反的是,此时运行T2的处理器core2会一直不断地循环检查锁是否可用(自旋锁请求),直到获取到这个自旋锁为止。
    从“自旋锁”的名字也可以看出来,如果一个线程想要获取一个被使用的自旋锁,那么它会一致占用CPU请求这个自旋锁使得CPU不能去做其他的事情,直到获取这个锁为止,这就是“自旋”的含义。
    当发生阻塞时,互斥锁可以让CPU去处理其他的任务;而自旋锁让CPU一直不断循环请求获取这个锁。通过两个含义的对比可以我们知道“自旋锁”是比较耗费CPU的

深拷贝和浅拷贝

https://blog.csdn.net/libin66/article/details/53140284
浅拷贝是只对指针进行拷贝,两个指针指向同一个内存块,深拷贝是对指针和指针指向的内容都进行拷贝,拷贝后的指针是指向不同内的指针。

重写和重载

https://www.cnblogs.com/weizhixiang/articles/5760286.html

  1. 成员函数重载特征:
    a 相同的范围(在同一个类中)
    b 函数名字相同
    c 参数不同
    d virtual关键字可有可无
  2. 重写(覆盖)是指派生类函数覆盖基类函数,特征是:
    a 不同的范围,分别位于基类和派生类中
    b 函数的名字相同
    c 参数相同
    d 基类函数必须有virtual关键字
  3. 重定义(隐藏)是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
    a 如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
    b 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。

C++的优点

https://www.cnblogs.com/ckings/p/3632997.html
C++的优点:

1.代码可读性好。

2.可重用性好。

3.可移植。

4.C++设计成无需复杂的程序设计环境

5.运行效率高,高效安全

6.语言简洁,编写风格自由。

7.提供了标准库stl

8.面向对象机制

9.很多优秀的程序框架包括Boost、Qt、MFC、OWL、wxWidgets、WTL就是使用的C++。

面向对象三大特性

这个可以回答上面的问题,继承,多态,封装

工具的使用,快捷键

VS2017,调试F5,开始执行不调试Ctrl+F5,逐语句F11,逐过程F10

第三方函数库

问到了boost,不是很了解,看了下才知道智能指针,内存池是这里的
https://www.cnblogs.com/findumars/p/7257415.html
https://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419

STL库

vector内存结构,如何分配内存
vector是连续内存,在插入数值时若内存空间不够,则新开辟一片2倍的内存空间,然后将原来的内容复制过来,插入新的数值,之后将原来的内存空间释放。

设计模式

https://blog.csdn.net/column/details/design.html
https://www.cnblogs.com/aeolian/p/7792587.html
设计模式(Design Pattern)是一套被反复使用、多数人知晓、经过分类编目的优秀代码设计经验的总结。使用设计模式是为了提高代码的重用性,是代码更易理解并保证代码的可靠性。
通常的设计模式可以概括为23种,按照特点可以将其分为三大类型:创建型、结构型、行为型。
感觉常考的有单例模式,适配器模式,观察者模式,工厂模式,以及对应的UML图,还有手写一个模式之类的。

网络编程

数据库工具

常用的MySQL,Oracle,DB2

增删改查,查询语句重点

  1. 增加
    insert into(可省略) 表名(列名) values(具体值)
    批量插入
    insert into(可省略) 表名(列名)
    values(值1) ,(值2)
  2. 删除
    Delete from(可省略) 表名 where<条件表达式> --删除数据会导致编号中断
    truncate table 表名 –清空表中数据,将表重置
  3. 修改
    update 数据表 set 字段名1=表达式1
    where<条件表达式>
  4. 查询
    Select top n * form 表名

加班的看法
看了哪些书

推荐阅读更多精彩内容

  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 3,471评论 1 4
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 17,162评论 8 197
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 6,510评论 1 21
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 2,579评论 1 14
  • 秋雨淅淅沥沥 要连下几天 即便打湿了裸露在室外的一切 降低了温度 我的心房依旧温暖 如温室大棚 可以栽种苗苗 灌溉...
    ErinTang阅读 63评论 0 1