互斥锁(Mutex) std::mutex类
时间: 2024-09-12 13:06:08 浏览: 38
C++11 并发指南之std::mutex详解
互斥锁(Mutex)是一种用于多线程程序中的同步机制,用来避免多个线程同时访问共享资源导致的数据竞争和不一致性问题。互斥锁的特点是同一时刻只有一个线程能够获得锁,从而访问临界区中的共享资源。
在C++标准库中,`std::mutex`是互斥锁的一个实现。它提供了一系列成员函数来控制对共享资源的访问:
- `lock()`:锁定互斥锁,如果该互斥锁已被其他线程锁定,则当前线程将被阻塞,直到获取锁。
- `unlock()`:释放互斥锁,使得其他等待锁的线程可以获取到锁。
- `try_lock()`:尝试锁定互斥锁,如果锁可用,则锁定它并返回true,否则返回false,当前线程不会被阻塞。
`std::mutex`通常是通过RAII(资源获取即初始化)原则来使用的,这通常通过`std::lock_guard`或`std::unique_lock`这类包装器来实现。这些包装器在构造函数中自动锁定互斥锁,在析构函数中自动解锁互斥锁,从而保证了即使在异常发生时也能正确释放锁。
以下是一个简单的`std::mutex`使用示例:
```cpp
#include <mutex>
#include <thread>
std::mutex mtx; // 定义一个互斥锁
void print_even(int n) {
for (int i = 0; i < n; ++i) {
mtx.lock(); // 锁定互斥锁
if (i % 2 == 0) {
std::cout << i << " ";
}
mtx.unlock(); // 解锁互斥锁
}
}
void print_odd(int n) {
for (int i = 0; i < n; ++i) {
mtx.lock();
if (i % 2 != 0) {
std::cout << i << " ";
}
mtx.unlock();
}
}
int main() {
std::thread t1(print_even, 10);
std::thread t2(print_odd, 10);
t1.join();
t2.join();
return 0;
}
```
在这个例子中,两个线程分别打印出0到9中的偶数和奇数,互斥锁确保同一时刻只有一个线程能够执行打印操作。
阅读全文