淘天 客户端开发-C++ 一面

1. 自我介绍

2. 你为什么做这个项目

3. 你在项目中有遇到什么困难吗?

4. 这个项目是买的博主的还是学校让做的

5. 项目中有用到线程池吗?线程池的核心结构是什么?

项目中使用了线程池处理服务端异步业务逻辑,避免阻塞IO线程。核心结构包括:任务队列、工作线程组、互斥锁(保证队列安全)、条件变量(线程等待与唤醒)、任务提交与调度接口。

#include <iostream>
#include <vector>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
using namespace std;

class ThreadPool {
public:
    ThreadPool(int num = 4) : stop(false) {
        for (int i = 0; i < num; ++i)
            threads.emplace_back([this] { run(); });
    }

    template<class F>
    void addTask(F&& f) {
        unique_lock<mutex> lock(mtx);
        tasks.emplace(forward<F>(f));
        cv.notify_one();
    }

    ~ThreadPool() {
        stop = true;
        cv.notify_all();
        for (auto& t : threads) t.join();
    }

private:
    void run() {
        while (true) {
            unique_lock<mutex> lock(mtx);
            cv.wait(lock, [this] { return stop || !tasks.empty(); });
            if (stop && tasks.empty()) return;
            auto task = move(tasks.front());
            tasks.pop();
            lock.unlock();
            task();
        }
    }

    vector<thread> threads;
    queue<function<void()>> tasks;
    mutex mtx;
    condition_variable cv;
    bool stop;
};

6. RPC 服务端收到消息时会有异步处理,这部分你是怎么设计的?

服务端采用IO线程与工作线程分离的设计:

  1. IO线程仅负责接收数据、拆包、协议解析;
  2. 将解析完成的请求封装为任务对象;
  3. 提交至线程池异步执行业务逻辑;
  4. 处理完成后,将响应结果交还给IO线程发送回客户端。该设计保证IO线程不被耗时逻辑阻塞,提升系统并发能力。

7. 项目底层使用什么协议通信?为什么选用 TCP?

底层采用TCP协议通信。RPC调用要求消息可靠、有序、不丢失、不重复,TCP原生支持连接管理、确认应答、超时重传、流量控制和拥塞控制,能保证远程调用的稳定性和正确性,非常适合RPC这种强可靠性要求的场景。

8. 如果换成 UDP 可以吗?上层需要做哪些设计来保证可靠性?

UDP可以使用,但UDP本身不可靠,必须在应用层实现可靠性机制:

  1. 消息编号与序列号;
  2. ACK确认应答机制;
  3. 超时重传策略;
  4. 乱序数据包重排;
  5. 重复数据包过滤;
  6. 基础拥塞控制。相当于在应用层实现一套轻量级TCP可靠性协议。

9. 你了解 muduo 库的底层实现模型吗?

muduo采用one loop per thread + 线程池的经典高并发模型:

  1. 基于epoll事件驱动,非阻塞IO;
  2. 每个线程拥有独立的事件循环loop;
  3. IO线程只处理网络事件,不执行业务逻辑;
  4. 耗时业务交由线程池异步处理;整体无锁设计、低延迟、高并发,是客户端/服务端网络层的优秀实现方案。

10. 你的项目主体只有 RPC 客

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

不会做题的小熊:我感觉我就算是找不到工作,我也不会作弊进去,作弊进去感觉一方面是自己不踏实,其次就是都靠作弊了,那后面肯定工作的心态是不一样的,没有一种内驱力。
点赞 评论 收藏
分享
4月12号,腾讯二面。面试官问:&quot;你简历上这个推荐系统,能详细讲讲吗?&quot;我深吸口气,开始背准备好的答案:&quot;这个推荐系统基于协同过滤算法,使用Spark处理大数据,Redis做缓存...&quot;&quot;等等,&quot;面试官打断我,&quot;我没问技术。这个系统要解决什么问题?&quot;我愣了:&quot;就是给用户做推荐啊...&quot;&quot;推荐什么?为了什么目标?提升DAU还是转化率?&quot;&quot;应该是...提升活跃度...&quot;我越说越没底气。面试官摘下眼镜:&quot;你负责的部分,具体解决了什么问题?&quot;我脑子一片空白,半天憋出一句:&quot;处理用户行为数据...&quot;沉默了十秒钟。面试官语气变淡:&quot;好的,聊下一个问题。&quot;那次面试不到25分钟就结束了。走出腾讯大楼,深圳的太阳晒得人发晕,我却浑身发冷。明明准备了很多次,为什么临场就是说不出来?晚上我把之前所有面试录音听了一遍,越听越不对劲。我发现自己每次回答都很&quot;死板&quot;——像在背课文,不是在交流。面试官问A我就背答案A,追问就卡壳。更可怕的是,我准备面试的方式有问题。我把网上的&quot;高频面试题100道&quot;全背下来了,但实际面试中,面试官问的往往不在这100道里。我这才意识到:我把面试当成了&quot;考试&quot;,以为背好题就能过。但面试不是考试,是&quot;对话&quot;。周末我找在阿里的表哥做模拟面试。他按真实标准来问,把我&quot;虐&quot;得体无完肤。问题一:自我介绍没记忆点我按准备的版本说了两分钟。表哥打断:&quot;你说这么多,我能记住你什么?&quot;&quot;记住我名字?&quot;&quot;不,我连名字都记不住。你的介绍就像念简历,毫无特点。&quot;问题二:回答缺少结构表哥问我最有挑战的项目,我想到哪说到哪。他再次打断:&quot;你说了一分钟,全是碎片信息。能不能用清晰的结构讲?&quot;我试了几次,根本不知道怎么&quot;有结构地&quot;讲。问题三:遇到不会的就慌表哥突然问:&quot;如果让你设计秒杀系统,怎么做?&quot;我脑子空白:&quot;我没做过...&quot;&quot;没做过不代表不能想。&quot;但我就是不知道怎么应对。问题四:数据模糊,没说服力&quot;你那个系统上线后效果怎么样?&quot;&quot;挺好的,很稳定。&quot;&quot;什么叫'挺好'?能量化吗?&quot;&quot;这个...没太关注数据...&quot;表哥摇头:&quot;面试官最烦这种模糊表达。'挺好''不错'没有任何信息量。&quot;模拟面试后,表哥总结:&quot;你的问题不是准备不够,而是方向错了。你在准备'答案',但面试官要看'思考过程'。&quot;我彻底推翻了之前的准备方式,重新设计了清单:准备一:重构自我介绍用&quot;标签+故事+钩子&quot;替代流水账。&quot;我是XX,您可以理解为'用数据驱动决策的后端工程师'。去年实习时发现订单系统会崩溃,我主动提出异步处理方案,把处理时间从5秒降到800ms,支撑618零故障。这让我对高并发优化有了深入理解。看到贵司在做XX业务,特别想知道你们怎么处理的?&quot;准备二:用&quot;STAR+思考&quot;讲项目不只讲过程,更要讲思考。S(情境)-&nbsp;要有冲突:&quot;大促前一周系统会崩,不解决肯定出事&quot;T(任务)-&nbsp;目标明确:&quot;一周内把并发从1000提升到5000&nbsp;QPS&quot;A(行动)-&nbsp;分层讲述:&quot;分三步:定位瓶颈、优化方案、压测验证&quot;R(结果)-&nbsp;数据+收获:&quot;最终支撑8000&nbsp;QPS零故障,让我明白要建立常态化监控&quot;准备三:针对JD定制提取JD关键词,找简历上最匹配的2-3个项目,把80%时间花在这些项目上。设计&quot;引导话术&quot;,主动提及这些项目。准备四:模拟实战找人做真实模拟,录音回听找问题,每个问题限时2-3分钟练习。改变方式后,我投了字节。二面时用新框架讲项目,面试官听得很认真,还不时点头。他问:&quot;如果并发再大10倍怎么处理?&quot;以前我会慌,这次我先理清思路:&quot;可以从三个层面考虑:架构层面做服务拆分,技术层面用Redis集群+限流,业务层面用排队削峰。具体选哪个要看场景,紧急情况我会优先限流+缓存,因为改动小见效快。&quot;面试官说:&quot;你思路挺清晰的,思维方式和我们团队挺match。&quot;一周后拿到了offer。准备时我用了AiCV简历王,能根据JD生成针对性面试题,模拟真实场景,帮我发现了很多没注意到的问题。总结一下:面试的本质不是证明你多完美,而是让面试官看到你的思考、潜力、真诚。三个建议:准备&quot;思考&quot;不是&quot;答案&quot;——每个项目花1-2小时深度复盘用&quot;故事&quot;不是&quot;陈述&quot;——有场景有冲突有解决过程针对JD靶向准备——提取关键词,重点准备匹配项目
查看10道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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