推荐答案
在C++中,线程同步可以通过使用std::mutex和std::condition_variable来实现。以下是一个简单的示例,展示了如何使用这些工具来同步线程:
// www.javascriptcn.com code example
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
std::unique_lock<std::mutex> lock(mtx);
while (!ready) {
cv.wait(lock);
}
std::cout << "Thread " << id << '\n';
}
void go() {
std::unique_lock<std::mutex> lock(mtx);
ready = true;
cv.notify_all();
}
int main() {
std::thread threads[10];
for (int i = 0; i < 10; ++i) {
threads[i] = std::thread(print_id, i);
}
std::cout << "10 threads ready to race...\n";
go();
for (auto& th : threads) {
th.join();
}
return 0;
}在这个示例中,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共同实现了线程间的同步。