1. 为什么线程间通信是C++面试的高频考点
在C++开发岗位的面试中,线程间通信几乎是必问的技术点。这背后有几个深层原因:首先,现代CPU早已进入多核时代,充分利用多线程能力是提升程序性能的关键手段;其次,C++作为系统级语言,经常被用于开发高性能、低延迟的应用程序,这类场景对线程协作的要求极高;最后,线程间通信涉及同步、数据安全等复杂问题,能很好考察候选人的基本功。
我在面试候选人时,通常会先问一个简单的问题:"假设你有两个线程,一个负责采集数据,一个负责处理数据,你会用什么方式让它们协作?"很多初级开发者会直接回答"用全局变量",这显然没有理解线程安全的本质。正确的思路应该从通信机制的选择开始,考虑数据量、实时性要求和系统开销等因素。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 五种主流线程通信方式详解
2.1 共享内存与互斥锁
这是最基础的通信方式,也是新手最容易犯错的地方。基本模式是通过共享变量配合mutex实现数据传递:
cpp复制#include <mutex>
#include <queue>
std::queue<int> data_queue;
std::mutex mtx;
// 生产者线程
void producer() {
for(int i=0; i<10; ++i) {
std::lock_guard<std::mutex> lock(mtx);
data_queue.push(i);
}
}
// 消费者线程
void consumer() {
while(true) {
std::unique_lock<std::mutex> lock(mtx);
if(!data_queue.empty()) {
int value = data_queue.front();
data_queue.pop();
lock.unlock();
// 处理数据
} else {
lock.unlock();
std::this_thread::yield();
}
}
}
关键细节:这里使用了lock_guard和unique_lock两种不同的锁管理方式。前者适用于简单作用域,后者在需要手动控制锁生命周期时更灵活。
实际项目中容易踩的坑:
- 忘记解锁导致死锁(推荐使用RAII风格的锁管理)
- 锁粒度太大影响性能
- 没有处理虚假唤醒问题
2.2 条件变量(condition_variable)
共享内存方式的升级版,解决了忙等待(busy-waiting)问题:
cpp复制std::condition_variable cond_var;
// 修改后的生产者
void pr
