二面技术
一面
基础
- 介绍下项目
项目描述,我做的方面, - 项目的难点
- 介绍下https
https=http+ssl - Ssl原理,如何协商密钥的
- 数据加密用哪个密钥
- New 和malloc区别,在为一个对象分配内存时,这两个分别是如何做的(做了哪些事)
- 面向对象特性
- 一个类的默认函数
6个 - C++11里还有其他的默认函数么
- C++11特性
列表初始化、匿名函数、auto、decltype、智能指针、 - Shared_ptr和unique_ptr区别及适用场景,是不是线程安全,不是的话,如何保证线程安全
- Fork函数
- 了解并发编程么
- 谈到项目里用过多线程等,并说了下多线程会带来的问题
- 如何解决多线程中的同步问题
同一个进程的多个线程会占用共享的资源,对于共享的资源可以用锁,根据不同的需求可用互斥锁、读写锁等 - Map了解么
底层是红黑树、排序好的等 - 红黑树的特性知道么
Blabla - Deque的实现,及前端插入的时间复杂度
- Tcp的三次握手
- 如果tcp建立连接后,客户端网线断了,这时候服务端知道么?
- 死锁如何检测
资源分配图,blabla - 死锁的条件
- 不同进程的通信方式
不同主机用socket,同一主机用 blabla - 全局变量存储在哪?
静态区 - 平时如何学习C++语言
二面
基础
-
重点围绕着项目,项目可能会遇到高并发,网络IO等问题,
-
高并发怎么解决
可采用多线程,线程池来解决可采用多线程,线程池来解决 -
网络io:可采用epoll,
-
三种io多路复用优缺点
-
Epoll的两种模式
-
进程、线程同步的方式,让介绍每一种原理
-
锁进制,互斥锁、读写锁、自旋锁、条件变量都介绍一次,以及每个的原理
-
内存模型等
算法题1:反转链表
这个题面试手写代码出现频率很高,一定要会写
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
递归版的:
ListNode* ReverseList(ListNode* pHead) {
//如果链表为空或者链表中只有一个元素
if(pHead==NULL||pHead->next==NULL) return pHead;
//先反转后面的链表,走到链表的末端结点
ListNode* pReverseNode=ReverseList(pHead->next);
//再将当前节点设置为后面节点的后续节点
pHead->next->next=pHead;
pHead->next=NULL;
return pReverseNode;
}
非递归版的:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL || pHead -> next == NULL)
return pHead;
ListNode* pre = NULL;
ListNode* next = NULL;
while(pHead != NULL){
next = pHead->next;
pHead->next = pre;
pre = pHead;
pHead = next;
}
return pre;
}