一面:
项目
手写单例模式
面试的时候不要画蛇添足,按照按面试管的节奏来,先写一个简单的单例模式,除非特别熟悉, 不要一上来就考虑线程安全问题。
单例分为饿汉模式和懒汉模式,饿汉模式一开始就创建好,懒汉模式需要用户自己创建
class Singleton{
public:
static Singleton& getInstance(){
return inStance;
}
private:
Singleton() {
std::cout << "Singleton():" << this << std::endl;
}
//防拷贝
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
static Singleton inStance;
};
Singleton Singleton::inStance; //静态对象类外初始化
要记住设为私有的有构造函数,拷贝构造函数,赋值重载函数三个函数。
懒汉模式:不必在程序一开始就创建实例,保证在使用之前创建好即可。
class Singleton{
public:
static Singleton* getInstance(){
if(p_inStance == nullptr){
p_inStance = new Singleton();
}
return p_inStance;
}
private:
Singleton(){
std::cout << "Singleton()" << this << std::endl;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
static Singleton* p_inStance;
};
Singleton* Singleton::p_inStance = nullptr;
如果在问深入一点可以,考虑线程完全问题,在C++11中通过加锁可以解决。
class Singleton{
public:
static Singleton* getInstance(){
if(p_inStance == nullptr){ //减少线程阻塞
m_mutex.lock();
if(p_inStance == nullptr){
p_inStance = new Singleton();
}
m_mutex.unlock();
}
return p_inStance;
}
class GC{
public:
~GC(){ //垃圾回收类
if(p_inStance != nullptr){
delete p_inStance;
}
}
};
static GC gc; //定义静态成员变量,当程序结束时,系统自动调用析构函数
private:
Singleton(){
std::cout << "Singleton()" << this << std::endl;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
static Singleton* p_inStance;
static std::mutex m_mutex;
};
Singleton* Singleton::p_inStance = nullptr;
std::mutex Singleton::m_mutex;
Singleton::GC Singleton::gc;
TCP/UDP及应用场景
volatile
防止编译器优化
分布式锁
进程/线程
然后一道题:一个单链表从表结尾开始每隔k个元素进行反转,例如:1->2->3->4>5->6->7,k=3,反转后,1->4->3->2->7->6->5
二面:
LInux的ctrl C ,kill 的内部原理,
信号机制
kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作
socket编程【客户端发一个,服务器回发一个一样的】,
echo服务器。
段页式内存管理会访问多少次内存【二面一个没答上来?】,
估计看我可怜兮兮的问了我一个TCP,多线程打印
然后代码题:134876923431586532,任意移动字符位置,不限制移动次数,写出算法找到移动后比给定字符串大并且最接近它的那个
你有什么想问的吗
1.HTTP和RPC的区别
2.HTTP的常见方法,post与get差别,常见的请求头key-val对儿
GET,POST, HEAD,PUT, DELETE, OPTIONS等
GET:获取资源
POST:传输实体主体
POST 主要目的不是获取资源,而是传输实体主体数据。
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL中,而 POST 的参数存储在实体主体部分。
GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。
3.后台报504错误,分析原因如何解决
4.数据库的索引问题,针对场景如何建立索引,为什么这么建立索引,怎样优化
mysql 。订单 order 实体有几个属性:产品(product_id)、下单日期(date)等,请设计 索引 实现下列需求并优化索引:
------
查询某个产品的所有订单。
查询某一天的所有订单。
查询有个产品最近一个月的所有订单。
-----
5.编程题
对两个二进制字符串求十进制的和
Leetcode67题
6.设计一个HTTP服务,如何查询出订单量前十的商品,后台如何做
7.python的并发的问题