C++中操作vector时如何避免线程混乱?
解决vector并发访问的线程安全问题
问题根源
std::vector的所有成员函数都不具备线程安全性,当多个线程同时对同一个vector实例执行读写操作(比如一个push、一个erase)时,会触发数据竞争,导致内存结构损坏,最终引发程序崩溃这类未定义行为。
修复方案
通过**互斥量(std::mutex)**同步所有对vector的访问操作,保证同一时间只有一个线程能操作vector。
修复后的完整代码
#include <thread> #include <vector> #include <mutex> using namespace std; vector<int> v_test; mutex mtx; // 用于保护v_test的互斥锁 void push() { lock_guard<mutex> lock(mtx); // RAII自动锁,作用域结束自动释放 v_test.push_back(0); } void erase() { lock_guard<mutex> lock(mtx); if (v_test.size() > 0) { v_test.erase(v_test.begin()); } } int main() { thread w0(push); thread w1(erase); w0.join(); // 等待子线程执行完成 w1.join(); while (true) { Sleep(1000); } return 0; }
核心细节说明
- std::mutex:创建互斥锁,确保同一时间只有一个线程进入被保护的代码区域,避免并发冲突。
- std::lock_guard:RAII风格的锁管理工具,构造时自动获取锁,析构时自动释放锁,无需手动调用unlock(),能有效避免异常或代码分支导致的锁泄漏。
- join()调用:原代码未等待子线程完成就进入死循环,虽然Sleep不影响,但添加join()是标准的线程实践,确保子线程逻辑执行完毕。
内容的提问来源于stack exchange,提问作者user19816087
相关产品推荐
相关产品推荐

