C++ 面试题
目录

C++ 中如何进行线程同步 (std::mutex, std::condition_variable)?

· 约 3 分钟读完 · 第 101 / 181 章

推荐答案

在C++中,线程同步可以通过使用std::mutex和std::condition_variable来实现。以下是一个简单的示例,展示了如何使用这些工具来同步线程:

在这个示例中,std::mutex用于保护共享资源(ready变量),而std::condition_variable用于在条件不满足时阻塞线程,并在条件满足时唤醒线程。

本题详细解读

1. std::mutex 的作用

std::mutex 是C++标准库中用于保护共享资源的互斥锁。它确保在同一时间只有一个线程可以访问被保护的资源。在示例中,mtx用于保护ready变量,防止多个线程同时修改它。

2. std::condition_variable 的作用

std::condition_variable 用于在多线程环境中实现条件等待。它允许线程在某个条件不满足时进入等待状态,并在条件满足时被唤醒。在示例中,cv.wait(lock)会使线程进入等待状态,直到cv.notify_all()被调用。

3. std::unique_lock 的作用

std::unique_lock 是一个灵活的锁管理类,它允许在构造时锁定互斥量,并在析构时自动解锁。它还支持手动锁定和解锁操作。在示例中,std::unique_lock用于管理mtx的锁定状态。

4. cv.notify_all() 的作用

cv.notify_all() 用于唤醒所有等待在cv上的线程。在示例中,当ready变量被设置为true时,调用cv.notify_all()会唤醒所有等待的线程,使它们继续执行。

5. 线程同步的过程

  • 主线程创建了10个子线程,每个子线程都调用print_id函数。
  • 在print_id函数中,线程首先获取mtx的锁,然后检查ready变量。如果ready为false,线程会调用cv.wait(lock)进入等待状态。
  • 主线程调用go()函数,将ready设置为true,并调用cv.notify_all()唤醒所有等待的线程。
  • 被唤醒的线程会重新检查ready变量,发现其为true,然后继续执行,打印线程ID。

通过这种方式,std::mutex和std::condition_variable共同实现了线程间的同步。