多线程使用队列出现deque iterator not dereferencable
时间: 2024-01-24 12:02:45 浏览: 273
这个错误通常是由于多线程同时访问同一个 `deque` 对象,导致在一个线程正在进行迭代器操作的时候,另一个线程修改了 `deque` 的结构,导致迭代器失效,从而出现的错误。
解决这个问题的方法是在多线程中使用 `deque` 对象时,使用线程安全的方式进行访问。一种常见的方式是使用互斥锁来保护 `deque` 对象的访问,确保同一时间只有一个线程可以访问 `deque` 对象。具体代码实现可以参考下面的示例:
```c++
#include <iostream>
#include <deque>
#include <mutex>
#include <thread>
std::deque<int> dq;
std::mutex dq_mutex;
void producer() {
for (int i = 0; i < 100; ++i) {
std::lock_guard<std::mutex> lock(dq_mutex);
dq.push_back(i);
}
}
void consumer() {
while (true) {
std::lock_guard<std::mutex> lock(dq_mutex);
if (!dq.empty()) {
std::cout << dq.front() << std::endl;
dq.pop_front();
}
else {
break;
}
}
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
std::thread t3(consumer);
t1.join();
t2.join();
t3.join();
return 0;
}
```
在上面的代码中,我们使用了 `std::mutex` 来保护了 `dq` 的访问,确保了线程安全性。注意在使用 `std::lock_guard<std::mutex>` 时,需要传入一个 `std::mutex` 对象来进行锁定。
阅读全文