如何在C++中实现线程间的互斥和同步?
时间: 2024-11-03 16:18:45 浏览: 14
在C++中,为了实现线程之间的互斥和同步,通常会使用到一些同步原语和库函数。以下是常见的几种方法:
1. **互斥锁(Mutex)**:
- `std::mutex`:这是C++11引入的标准库锁,可以用于保护共享资源,只有一个线程能同时持有锁,其他线程必须等待锁释放才能进入。
```cpp
#include <thread>
#include <mutex>
std::mutex mtx;
void thread_function() {
std::lock_guard<std::mutex> lock(mtx); // 自动管理锁
// 访问临界区...
}
```
2. **条件变量(Condition Variables)**:
- `std::condition_variable`:配合互斥锁使用,允许线程在满足特定条件后被唤醒并继续执行。
```cpp
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
// 主线程先唤醒子线程
cv.notify_one();
void thread_function() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{return some_condition;}); // 等待条件成立
}
```
3. **信号量(Semaphore)**:
- C++标准库没有提供信号量,但有些第三方库如Boost.Thread提供了这个功能,它是一种计数信号,控制对资源的访问。
4. **原子操作(Atomic Operations)**:
- 如果数据结构足够简单,C++11引入了`std::atomic`模板类,可以直接保证线程安全的操作。
```cpp
std::atomic<bool> flag = false;
flag.store(true, std::memory_order_release); // 发布信号
bool check_and_wait() {
return flag.load(std::memory_order_acquire); // 获取并检查信号
}
```
阅读全文