std::queue<int> taskQueue;改成std::atomic
时间: 2023-07-02 09:21:05 浏览: 174
如果要将 `std::queue<int> taskQueue` 改成 `std::atomic<std::queue<int>> taskQueue`,需要注意以下几点:
1. `std::queue` 并不是一个原子类型,因此不能直接使用原子类型来包装它。
2. 可以将 `std::queue` 改为 `std::vector`,因为 `std::vector` 是连续的内存块,可以保证原子性。
3. 可以使用 `std::mutex` 和 `std::condition_variable` 实现原子操作。
因此,如果要保证线程安全,可以将代码改为以下形式:
```c++
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> taskQueue;
std::mutex taskMutex;
std::condition_variable taskCV;
// 生产者线程
void producer() {
int task = ...; // 生成任务
{
std::lock_guard<std::mutex> lock(taskMutex);
taskQueue.push(task);
}
taskCV.notify_one();
}
// 消费者线程
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(taskMutex);
taskCV.wait(lock, []{ return !taskQueue.empty(); });
int task = taskQueue.front();
taskQueue.pop();
lock.unlock();
// 处理任务
}
}
```
这样就可以保证多线程环境下对任务队列的原子操作。
阅读全文