C++ 使用unique_lock进行多线程问题处理举例说明
时间: 2023-08-03 20:07:03 浏览: 190
在C++中,`std::unique_lock`是一个灵活的互斥量封装类,用于处理多线程同步问题。它提供了更多的灵活性和功能,比起`std::lock_guard`更常用。
以下是一个使用`std::unique_lock`解决多线程问题的示例:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 定义一个互斥量
void printMessage(const std::string& message) {
std::unique_lock<std::mutex> lock(mtx); // 创建一个unique_lock并锁住互斥量
for (int i = 0; i < 5; ++i) {
std::cout << message << std::endl;
}
lock.unlock(); // 解锁互斥量
}
int main() {
std::thread t1(printMessage, "Thread 1");
std::thread t2(printMessage, "Thread 2");
t1.join();
t2.join();
return 0;
}
```
在上述示例中,我们定义了一个全局的`std::mutex`对象`mtx`作为互斥量。然后,我们创建了两个线程`t1`和`t2`,并且每个线程调用`printMessage`函数来输出一定次数的消息。
在`printMessage`函数中,我们首先创建了一个`std::unique_lock<std::mutex>`对象`lock`,并且通过构造函数将互斥量`mtx`作为参数传递进去。这样,`lock`对象会自动锁住互斥量,确保只有一个线程能够进入临界区。
在临界区内,我们输出了一定次数的消息。由于互斥量的保护,每个线程会按照顺序输出自己的消息,避免了竞争条件。最后,我们调用`lock.unlock()`手动解锁互斥量。
在`main`函数中,我们创建了两个线程并启动它们,然后通过`join()`函数等待线程结束。
通过使用`std::unique_lock`,我们可以更灵活地控制互斥量的锁定和解锁时机,并且提供了更多的同步操作,比如条件变量等。这样可以有效地处理多线程之间的同步和竞争条件问题。
阅读全文