C++ 面试题 目录

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

推荐答案

在C++中,线程同步可以通过使用std::mutexstd::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变量。如果readyfalse,线程会调用cv.wait(lock)进入等待状态。
  • 主线程调用go()函数,将ready设置为true,并调用cv.notify_all()唤醒所有等待的线程。
  • 被唤醒的线程会重新检查ready变量,发现其为true,然后继续执行,打印线程ID。

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

纠错
反馈