You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:06:44