std::atomic的信号量和条件变量用法,提供代码示例
时间: 2024-06-23 12:03:01 浏览: 201
PaddleTS 是一个易用的深度时序建模的Python库,它基于飞桨深度学习框架PaddlePaddle,专注业界领先的深度模型,旨在为领域专家和行业用户提供可扩展的时序建模能力和便捷易用的用户体验
`std::atomic`在C++中是一个用于原子操作的库,它提供了线程安全的内存访问,这对于处理并发中的同步和互斥非常重要。信号量(Semaphore)和条件变量是两个经典的并发工具,它们常常与`std::atomic`一起使用来控制线程之间的通信。
**信号量(Semaphore):**
信号量是一种计数器,用于控制同时访问资源的线程数量。当一个线程请求访问而信号量的值大于0时,信号量减一;当信号量为0且有线程等待时,线程会被阻塞直到信号量增加。以下是一个简单的信号量用法:
```cpp
#include <atomic>
#include <thread>
std::atomic<int> semaphore(0); // 初始化为0,表示没有可用资源
void thread_function() {
while (semaphore.fetch_sub(1) == 0) { // 如果没有资源,线程会等待
std::this_thread::yield(); // 让出CPU给其他线程
}
// 执行任务
semaphore.fetch_add(1); // 使用完资源后,加回1
}
int main() {
std::thread t(thread_function);
// 启动另一个线程
// ...
// 当主线程完成某些操作后,调用semaphore.release() 释放一个资源
t.join();
return 0;
}
```
**条件变量(Condition Variable):**
条件变量是在某个条件满足时唤醒等待线程的机制。它通常配合锁(如`std::mutex`)一起使用。当一个线程持有锁并检查条件不满足时,它会进入等待状态,并释放锁,让其他线程有机会修改可能影响条件的状态。当条件满足时,持有锁的线程可以通过`notify_one()`或`notify_all()`唤醒等待的线程。以下是条件变量的使用示例:
```cpp
#include <mutex>
#include <condition_variable>
#include <atomic>
std::mutex mtx;
std::condition_variable cv;
std::atomic<bool> condition_met(false);
void thread_function() {
std::unique_lock<std::mutex> lck(mtx);
cv.wait_for(lck, std::chrono::seconds(1), []{return condition_met;}); // 等待条件满足
// 条件已满足,执行任务
}
int main() {
std::thread t(thread_function);
// 假设在某个时间点条件met = true
{
std::lock_guard<std::mutex> lck(mtx);
condition_met = true; // 设置条件
cv.notify_all(); // 唤醒所有等待的线程
}
t.join();
return 0;
}
```
阅读全文