同程旅行 - C++ 开发工程师 - 一面(春招第三面)

全程将近一小时,会议上写着预计半小时。面试官整体很耐心地再引导我回答问题,部门是做中间件代理相关的。八股和项目都拷打的非常细致,能感觉出来面试官提问有倾向性,基本都是问挂掉了怎么办?出现异常怎么办?没有单纯八股文问答,感觉整体面试很专业,没啥水分,干货满满。

技术面经

C++:

  • new 和 malloc 的区别
  • new 出来的对象可以用 free 释放吗(如果是 int 类型指针呢)
  • 一个 int 数组可以用 delete 命令释放么(不可以、int 数组采用 new[] 分配、应用 delete[] 释放)
  • 释放一个数组为什么非要用 delete[]、delete 命令不行吗
  • C++ 有其他方式可以更好地管理数组资源么(容器 vector、智能指针、RAII)
  • 智能指针有哪几种类型
  • 什么情况下需要使用 weak_ptr
  • 如何去调用 weak_ptr 指向的对象及其方法(先将 weak_ptr 转化为 shared_ptr 再调用)

Golang:

  • 使用 channel 可能会有哪些隐患(死锁 & 阻塞)
  • 针对一个无缓冲 channel,先启动一个 goroutine 向 channel 中不断写入数据,再挂起一个 goroutine 从 channel 中不断读取数据,此时程序会发生什么?如果是一个大小为 4 的有缓冲 channel,一开始只向 channel 中写入一个数据,后面读取程序相同,程序又会如何?
  • 使用 for i, v := range arr 语句遍历对象数组时,变量 v 中保存的是对象的引用还是值拷贝?
  • 如果想通过 for ... range 将一个数组的值拷贝到另一个数组,数组拷贝后的结果是什么?
m := make(map[int]*int)
arr := []int{1, 2, 3, 4, 5}
for i, v := range arr {
    m[i] = &v  // v 只做值拷贝, 相当于 v 每次都保存相同的地址
}
for k, v := range m {
    fmt.Println(k, *v)  // *v 全部是最后一个元素的数值 5
}

Project:

  • jiyun-ns 你主要的工作内容和难点
  • jiyun-ns 中你的程序通过何种方式与 etcd 进行通信(gRPC)
  • dag-engine 中如何实现 Redis 分布式锁(SETNX + 过期时间 + 续费机制)
  • dag-engine 中如果工作线程挂掉,没有关掉 channel,其他线程只能等待锁过期后再获取锁吗?同样情况下,执行续费操作的 goroutine 会一直续费吗?(潜在 bug、可以考虑使用 defer 语句关闭 channel)

Webserver:

  • 主线程和工作线程分别做哪些事情
  • 如果客户端发送请求后网络异常,你的服务器如何响应?能否感知到网络异常?(超时重试 & 心跳机制)
  • 如何处理过大的 HTTP 请求、是否出现让两个工作线程分别读取一部分消息(HTTP/1.1 请求未拆分)
  • 如何通过 Epoll 获取到活跃事件、并唤醒具体工作线程处理事件(pool->cond.wait(locker)
  • 对于被标记为活跃状态但实际上没有能力执行我方业务逻辑的 Socket、你有什么方法判别(业务逻辑验证)
  • 服务器如何与 MySQL 建立连接、使用哪个库和库函数(mysql.h
  • 如何使用什么函数读取消息(readv 实现分散读取、缓冲区大小为 65535 bit)
ssize_t Buffer::ReadFd(int fd, int* saveErrno) {
    char buff[65535];
    struct iovec iov[2];
    const size_t writable = WritableBytes();
    iov[0].iov_base = BeginPtr_() + writePos_;
    iov[0].iov_len = writable;
    iov[1].iov_base = buff;
    iov[1].iov_len = sizeof(buff);

    const ssize_t len = readv(fd, iov, 2);
    if(len < 0) {
        *saveErrno = errno;
    }
    else if(static_cast<size_t>(len) <= writable) {
        writePos_ += len;
    }
    else {
        writePos_ = buffer_.size();
        Append(buff, len - writable);
    }
    return len;
}
  • 使用 readv 读取消息完成后会收到什么提醒
#春招##软件开发2024笔面经#
全部评论
这个面试官好像没见过 Webserver 项目
5 回复 分享
发布于 2024-04-16 12:22 辽宁
C++前4个八股,都是new和malloc的区别😂,,,真的很经典,第一次面试也遇到了。。。当时不会
1 回复 分享
发布于 2024-04-22 10:01 广东
没空春招,天天来看看我的宝又面了些啥
1 回复 分享
发布于 2024-04-18 13:40 上海
webserver那块问的有点细,虽然之前都做过,真到面试问了,很难说出来,,,,比如 http 请求报文的接收调用了哪些接口,头文件分别是什么,各种为什么。。。
点赞 回复 分享
发布于 2024-04-22 10:06 广东
如果客户端发送请求后网络异常,你的服务器如何响应?能否感知到网络异常? 可以请教一下这个问题是怎么回答的吗?我也遇到过很多次这种问题,但客户端突然宕机后服务端好像是没法感知到,除非等到tcp保活或者是发送缓冲溢出。我之前一直回答的是服务端定时心跳报文,你是咋回答的嘞。
点赞 回复 分享
发布于 2024-04-16 14:05 广东
过了吗
点赞 回复 分享
发布于 2024-04-16 13:37 江苏

相关推荐

不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git&nbsp;commit,不会git&nbsp;pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗?&nbsp;哪怕是一个swap函数,开源项目里都经常注释:1&nbsp;3&nbsp;5&nbsp;7&nbsp;9&nbsp;2&nbsp;4&nbsp;6&nbsp;8&nbsp;10^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1.&nbsp;部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go……&nbsp;结果满脸懵的说ts是什么……我让看agent&nbsp;loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 11:22
点赞 评论 收藏
分享
评论
9
37
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务