std::atomic的信号量和条件变量用法,提供代码示例
时间: 2024-06-23 21:03:01 浏览: 194
有名信号量示例代码
`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;
}
```
阅读全文