场景:
1. 有时候需要使用vector 或 map作为多线程的共享变量, map是tree结构, 读和写方法都不是线程安全的, 即同时读写会有崩溃的现象.
2. std::vector直观来说只用push_back和[] 下标访问操作应该没问题,push_back往后边加对象, 索引值只访问已经存储的变量(预先求size).注意, 这里不会删除vector元素.
可惜,这种多线程操作还是会崩溃. 单线程写和单线程读!!!
看代码:
test_vector.cpp
#include "gtest/gtest.h"
#include <vector>
#include <iostream>
#include <Windows.h>
#include "pthread.h"
class A
{
public:
A(int i):i_(i){}
int i_;
};
void* first = NULL;
void* second = NULL;
static void* Push(void* data)
{
std::vector<A*>& vec = *(std::vector<A*>*)data;
vec.push_back(new A(-1));
first = std::addressof(vec._Myfirst);
//std::cout << first << std::endl;
for(int i = 0; i< 100000;++i)
{
vec.pu

本文讨论了在多线程场景下,C++ std::vector在进行push_back和下标访问时可能出现的崩溃问题。尽管可能认为这些操作是线程安全的,但在并发环境中仍可能导致数据不一致。文中通过代码示例展示了问题的发生,并提到了在Visual Studio C++ 2010 SP1环境下遇到的内存异常。为了解决这个问题,作者建议暂时使用C数组作为替代方案。
订阅专栏 解锁全文
4255

被折叠的 条评论
为什么被折叠?



