小编hop*_*pla的帖子

C++ STL地图/矢量和线程安全矢量

我想知道下面的代码是否会被认为是线程安全的.我认为它应该是,但我不太熟悉引擎盖下发生的事情.

基本上,我在类Foo中有这个函数,它将在主线程上调用并将一个向量作为一个anrgument,即

void Foo::func( vector<int> v)
Run Code Online (Sandbox Code Playgroud)

在Foo,我也有一个私人会员,

vector< vector<int> > vecOfVec;
Run Code Online (Sandbox Code Playgroud)

func,我会简单地推回任何新vvecOfVec和检查v的规模.如果v小于其预期的大小,我想开始另一个填充了v一些已知的预定值的线程,如此

void Foo::func( vector<int> v)
{
    int size = v.size();
    int index = vecOfVec.size();

    vecOfVec.push_back(v);

    if (size < 1000)
    {
        boost::thread t( boost::bind( &Foo::PushBackZeros, this, vecOfVec, index) );
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo::PushBackZeros 就像它的名字所暗示的那样,用'零填充'vecOfVec [index]'的向量,直到它的大小增加到1000;

现在,我没有在任何元素上看到任何并发读或写操作vecOfVec.显然,有可能对整个对象进行并发操作,但永远不会有特定元素的并发vecOfVec.

有人可以解释上述是否会被认为是线程安全的吗?STL地图也同样程度吗?如果没有,请解释.干杯!

c++ containers boost stl thread-safety

3
推荐指数
1
解决办法
2062
查看次数

派生类的C++数组与派生对象的基类指针数组 - 为什么分配的内存量如此之大?

我需要澄清一个我不太了解的问题.使用下面的两个场景,我会认为分配的内存量大致相同.但是,方案2 bad_alloc在一段时间后给了我一个例外,并且似乎像疯了一样咀嚼内存(使用Window的任务管理器作为分配给进程的内存量的代理).以下是使用MSVC10在Windows 32位上编译的.

假设我有以下基类:

template<class T>
class Base
{
protected:
    T x;
public:
    Base() {}
    Base(T _x) : x(_x){}
    virtual bool func() = 0;
};
Run Code Online (Sandbox Code Playgroud)

现在,至于派生类:

template<class T>
class Derived : public Base<T>
{
public:
    Derived() {}
    Derived(T _x) :  Base(_x){}
    bool func() { return true; };
};
Run Code Online (Sandbox Code Playgroud)

现在考虑两种情况.首先,分配Derived类的动态数组并用Derived对象填充它,即:

int main()
{
    int size = SOME_LARGE_NUMBER;
    Derived<int>* d = new Derived<int>[size];
    for (int i = 0; i < size; i++)
    {
        d[i] = Derived<int>(i);
    }

    // delete here
} …
Run Code Online (Sandbox Code Playgroud)

c++ memory polymorphism pointers bad-alloc

2
推荐指数
1
解决办法
1692
查看次数