腾讯CDG C++一面面试题

面经链接:https://www.nowcoder.com/discuss/653930322421108736?sourceSSR=search

1.线程、进程、协程都是什么 有什么区别

特性 线程 进程 协程
定义 进程中的轻量级子任务,共享进程的内存空间和资源。 操作系统中资源分配的基本单位,具有独立的内存空间。 用户态的轻量级任务切换,控制由用户代码管理。
内存空间 共享同一进程的内存空间,彼此之间无隔离。 拥有独立的内存空间,进程之间互相隔离。 共享同一线程的内存空间,不同协程之间可以共享数据。
创建开销 开销较小,创建和切换速度快。 创建和上下文切换开销较大,需要操作系统内核介入。 开销极小,切换非常快,因为在用户态中完成。
切换机制 由操作系统调度器在内核态进行切换。 由操作系统调度器在内核态进行切换。 由用户代码显式调度,在用户态进行切换。
并发性 支持并发执行,多线程可利用多核 CPU 资源。 支持并行和并发执行,不同进程可在多核上并行运行。 支持并发执行,但依赖于线程的执行,无法真正并行。
通信方式 通过共享内存直接通信,也可以使用互斥锁、条件变量等。 通过进程间通信(IPC)机制,如管道、消息队列、共享内存等。 直接共享数据结构,或通过消息传递。
安全性 由于共享内存,不当的操作可能导致数据竞争和安全问题。 进程间隔离较好,安全性较高,但通信较复杂。 用户态管理,容易发生不当使用导致的死锁或资源泄露。
使用场景 多任务处理、高并发场景,如服务器处理多用户请求。 独立应用程序、任务隔离、稳定性要求高的场景。 高效 IO 操作、协作式任务切换,如异步编程、事件驱动。

2.线程之间的通信

通信方式 描述 优点 缺点 适用场景
共享内存 多个线程共享同一块内存,线程可以通过访问这块内存来交换数据。 快速,无需内核参与 需要手动管理同步,容易出现竞态条件 大量数据传输,高性能场景
信号量 使用计数器来控制对共享资源的访问,确保多个线程之间互斥访问资源。 简单有效的同步机制 容易产生死锁,复杂度增加 资源有限,需严格控制访问的场景
互斥锁 互斥锁确保一次只有一个线程能够访问共享资源,其他线程需要等待锁释放。 提供线程安全的资源访问 可能导致死锁,特别是在锁的管理不当时 需要同步访问共享资源的场景
条件变量 线程可以等待某个条件成立,然后继续执行。条件变量通常与互斥锁配合使用。 支持线程等待特定事件发生 使用较复杂,需要与其他同步原语结合 需要线程等待特定条件的场景
消息队列 线程之间可以通过消息队列发送和接收消息,消息可以是任意数据类型。 线程之间解耦,安全的消息传递方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值