推荐答案
在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
共同实现了线程间的同步。