Linux C++岗位笔试题之一

Linux C++岗位笔试题之一

  1. 简答
    (1) 简述面向对象的三个基本特征,各自是如何实现的;
    封装、继承、多态
    封装:
    通过C++提供的关键这public/private/protected,用于声明哪些函数和数据是可以公开访问的、私用的或者受保护的
    继承:
    通过继承(泛化),组合(聚合)来实现
    多态:
    通过覆盖(虚函数、接口)、重载来实现
    (2) 简述重载和重写的区别,并对应用举例;
    重载是同名函数,不同参数,比如
    class Shape{
    public:
    void draw(void);
    void draw(int len);
    };
    重写是不同类中,比如:
    class Shape{
    public:
    void draw(void);
    };
    class Rectangle:public Shape{
    public:
    void draw(void);
    }
    (3) 简述指针、引用以及相应的应用场景;
    指针就是一个存放内存地址的整数,这个整数表示的是指向变量的地址;
    引用就是变量的别名;
    区别:
    指针声明的可以暂时不初始化,每次做检查,防止出现空指针异常;
    引用不用检查,因为引用永远不会为空,它一定有本体,一定得代表某个对象,引用在创建的同时必须被初始化。

引用的主要功能就是作为函数的参数和返回值,指向一个东西,一定专一,绝不会让其指向其它东西,用引用;其它情况都要用指针

(4) 多线程、多进程如何实现,各自优缺点,简述同步和互斥、进程间通信方式,
各自适用的场景;
多线程通过:

#include<iostream>
#include<thread>
using namespace std;
void proc(int &a)
{
    cout << "我是子线程,传入参数为" << a << endl;
    cout << "子线程中显示子线程id为" << this_thread::get_id()<< endl;
}
int main()
{
    cout << "我是主线程" << endl;
    int a = 9;
    thread th2(proc,ref(a));//第一个参数为函数名,第二个参数为该函数的第一个参数,如果该函数接收多个参数就依次写在后面。此时线程开始执行。
    cout << "主线程中显示子线程id为" << th2.get_id() << endl;
    th2.join();//此时主线程被阻塞直至子线程执行结束。
    return 0;
}

多进程通过:

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
 
int main()
{
    pid_t pid;
    pid = fork();
    //根据pid是否大于0判断是父进程还是子进程
    if (pid > 0) {
        std::cout << "Parent process" << '\n';
        return 0;
    }
    std::cout << "Child process" << '\n';
    return 0;
}

多进程的优点:
1、进程资源相互独立,互不干扰,子程序崩溃,不影响主程序稳定性,进程比较稳定健壮
2、减少线程加锁、解锁的影响,极大提高性能
3、每个进程可以获得本地全部地址空间各相关资源,性能上限大
多进程缺点:
1、逻辑控制复杂,需要与主程序进行交互
2、需要跨进程边界,对大量数据传输不友好
多线程的优点:
1、无需跨进程边界进行数据传输,通信更便捷
2、程序逻辑和控制方式简单
3、所有线程直接共享同一内存地址和资源
多线程缺点:
1、每一个线程与主程序共享地址空间,受限于本地内存空间大小
2、线程间由于共享同一资源,线程间同步和加锁控制操作麻烦
3、一个线程的崩溃可能影响整个程序的稳定性
多线程的场景:
数据需要修改,不同任务需要大量共享数据或频繁通信的情况下,比如IO密集性的任务
多进程场景:
不同任务间无需大量交互,上下文切换不频繁,可以使用多进程
比如守护进程,无需与主任务进行交互

互斥:
一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。
同步:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序进行,同步就是互斥基础上有顺序

进程间通信:
管道通信
消除队列通信
信号量通信
共享内存通信
套接字通信
(5) 简述对容器的了解,并举例说明应用场景;
vector向量:
底层实现:动态数组
适用场景:不频繁删除插入,经常查看的操作

deque双端队列:
底层实现:双向链表
适用场景:比如排队购票系统,头部的快速移除,尾部的快速添加

list队列:
底层实现:链表
适用场景:频繁删除插入的操作

set集合:
底层实现:红黑树
适用场景:查询某一个范围的值,比如学生的成绩,按照顺序排列

map映射:
底层实现:红黑树
适用场景:负责查询某个内容,具体到某一个单位,查询效率高,范围比set更宽一些。
二叉树的查找效率,在这里就体现出来了

(6) 如何预防和查找内存泄漏;
1、良好的编程习惯,只要有malloc/new,就得有free/delete
2、尽可能用智能指针
3、log记录
4、谁申请,谁释放

用valgrind:
比如:
gcc -o memleak main.cc -g
valgrind --tool=memcheck --leak-check=full ./memleak
(7) 简述实现线程池的基本思路;
(一)功能
添加任务到线程池
获取任务执行结果
维护线程池中线程状态
(二)设计思路
生产者&消费者模式
任务队列: 生产者与消费者公用的资源
生产者 : 将请求分解为多个小任务,并将其放入任务队列
消费者 : 线程池中的工作线程从任务队列中取任务进行处理
等待任务执行完毕
1)如何获得任务执行的结果?
将任务执行结果结构体的指针作为参数传给任务队列,在任务执行后直接将结果写到对应位置。
2)将任务A拆分为A1、A2、A3、A4、A5放入任务队列,如何知道任务已执行完毕?
对每个请求维护任务计数,当新增任务时计数++,当任务执行完毕时计数--;在每个请求后条件等待直到计数为0,表明该请求的任务执行完毕。
确定线程池 线程数&任务队列size
1)根据目前服务请求量计算线程个数
2)任务队列尽量设置够大
3)根据实际情况调整线程数

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,107评论 1 32
  • 写在前面: 犹豫了一下,不知道该不该发这么多。毕竟题目虽全,但是其实很多人看了不到一半,估计就会默默的收藏保存,等...
    Yt_cc阅读 14,666评论 1 6
  • 1、简述你项目中常用的设计模式。它们有什么优缺点?常用的设计模式有:代理、观察者、单例。(1)单例:它是用来限制一...
    LZM轮回阅读 1,024评论 0 6
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,446评论 1 4
  • http://download.csdn.net/detail/weasleyqi/4733438,本人知识浅薄,...
    红色海_阅读 555评论 0 1