--面试岗位:C++音视频服务开发
Q:用C++做过项目吗?
A:支支吾吾半天。。。,唉,书到用时方恨少a....

Q:说说你认为golang这种新语言相对C++有什么优势?
A:按照我对golang的了解,在开发中实际体会到的好处主要以下几点:
1开发效率:得益于golang相对于C++更严谨全面的语法和设计哲学而言,更简洁、规范、灵活。比如你不用再去争论大括号是否该换行,某个名字在外部无法访问,只需首字母小写,不用像C++引入访问控制符和名字空间作用域精确控制。同时,golang从设计之处就不是OOP的,它简化了OOP复杂的继承特性,同时原生支持组合,将一系列具有相同操作集合的数据类型抽象并声明为接口类型,可以实现运行时多态的效果。
2调试效率:从语言层面实现了gc,相对于C++有更少的内存问题,比如非法内存访问,未定义时的运行行为,内存泄漏,内存管理等。开发者只需要关注业务逻辑的实现,大多数都是逻辑bug,而C++要花费时间在内存bug的解决上,同时go自带测试驱动开发和性能监控组件,可以开发出性能更加,功能正确的应用程序。
3运行时效率:go比所有动态解释性脚本和java运行效率高,当然和C++没法比,但是官方benchmark给出的数据是平均性能只比C/C++慢2/3,这个效率表现很不错了。
4最重要的优势是从语言层面实现了协程和协程调度器,可以更容易开发出高并发的服务框架。

Q:有没有想过golang协程为何高效,底层的原理有了解过吗?在C/C++中有没有类似的模型或者说有没有办法模拟go那种协程管理方案?
A:golang协程调度原理这里不再说了,主要是后面个带有暗示的提问:
其实想让你说说 线程池+阻塞的任务队列的实现,再加上一个应用层来调度管理线程的调度器。

Q:你刚刚又说到线程池+任务队列的方式来模拟,那么worker(线程池中的线程对象)执行时间很长该怎么办?
A:对任务类型进行划分,即IO密集型还是CPU密集型。IO密集型任务遇到IO操作时,礼让出来。CPU密集型就没办法偷懒。

Q:那么我的worker要同客户端发送应答回复怎么办呢?
A:答的不太好,知道的可以告知下:

Q:或者这样问吧,就是我的woker如何和主线程通信,说我要发送应答给客户端了
A:线程通信?

Q:具体怎么通信?
A:互斥量、共享内存?

Q:互斥量和共享内存可以做线程通信吗?
A:em。。。。,那用加锁的发送包队列吧

Q: 知不知道有些类似的用C/C++的开源库实现了上述那种模型呢?
A:mordule(多线库)?

Q: 那个应该不算哈,有知道别的吗?
A:想了半天,唉,C/C++是真的不太熟悉,半信半疑试着说了个libevent吧,因为看过《高性能服务器框架》,里面讲了服务器的多线程并发模型,最后拿libevent说了下,所以,赌一把吧。

Q:对的哈。

Q:那么如何正确地发送数据给客户端呢,比如你总不能把李四的数据发给张三吧?
A: 会话管理啊,为用户ID和socket做个关联,用Socket当做key(具体记不清回答是Socket还是ID当做key了,哈哈。。。)

Q:可以用socket(ID)当做key?那客户端挂了怎么办?
A:崩溃的客户端用不这回数据了啊

Q:那socket可以重复吗,比如张三客户端闪退了(之前使用socket=100),这个时候新来的客户端又连上了,这个新的socket可以重复吗?
A:不能啊,socket(...)调用创建的是文件描述符啊,这个值怎么会重复

Q:这个值的确不重复,但系统是从当前最小可用的分配socket的,明白了吗?正确的做法是用一个自增列的id和socket共同作为key,来管理socket

A:好的

Q:基本没什么问题了,现在留个家庭作业,通过了后就来上班,我们是....行业,工资待遇你不用担心,很不错的。听清楚题目需求哈:
用C/C++实现一个高并发的聊天服务,有用户连上后发送某条消息,然后转发给在线的所有人,即相当于用户可以发送广播消息,不用搞得太复杂,也不用关心用户会话管理那些,用支持websocket应用层协议的开源网络框架库来解决,或者底层用什么网络框架不管,我只有以下几点要求:
1)功能正确,写个客户端测试工具去发送广播消息
2)注意你的代码风格
3)给出你的测试用例,我拿到你的东西,只会用你的代码编译出的程序,去跑你的测试用例
4)测测你的qps能达到多高
5)不管并发压力多大,数据不能丢失