使用move作为线程向量的自定义分配器 我现在正在学习C++中的并发性,并且遇到了一个线程的向量,我相信它将在C++ 0x中成为可能。但是,我当前的编译器似乎没有移动感知容器的实现,因此我会生成错误,因为std::thread::thread(const std::thread&)被删除,即我只能将移动构造函数/move赋值与std::thread一起使用

使用move作为线程向量的自定义分配器 我现在正在学习C++中的并发性,并且遇到了一个线程的向量,我相信它将在C++ 0x中成为可能。但是,我当前的编译器似乎没有移动感知容器的实现,因此我会生成错误,因为std::thread::thread(const std::thread&)被删除,即我只能将移动构造函数/move赋值与std::thread一起使用,c++,multithreading,c++11,move-semantics,move-constructor,C++,Multithreading,C++11,Move Semantics,Move Constructor,我认为我可以通过使用 void MyAllocator::construct (pointer p, reference val) /* should be non-const reference to val because using move constructor? */ { new ((void*)p) T (std::move(val)); } 而不是 void allocator::construct (pointer p, const_reference val) {

我认为我可以通过使用

void MyAllocator::construct (pointer p, reference val)
/* should be non-const reference to val because using move constructor? */
{
    new ((void*)p) T (std::move(val));
}
而不是

void allocator::construct (pointer p, const_reference val)
{
    new ((void*)p) T (val);
}
??或者此主题的其他一些变体(可能使用MyAllocator::construct的重载)


注意:这主要是一个短期的教育练习,并且能够很好地执行工作循环,以便在容器中使用线程。在这种情况下,我只会使用
MyAllocator
。但是,也请告诉我可能实现了此功能的任何库,以便我可以查看源代码。

避免此问题的最简单方法是在堆上分配线程并操作指向它们的指针


检查
Boost指针容器
库:
Boost::ptr_vector
在我看来似乎是您在寻找的对象。

std容器只接受可复制对象的要求与C++03容器接口的关系比与分配器实现的关系更大。 比如说

vector<T> b(100);
vector<T> a;
a=b;
assert(a==b);
可能会导致分配新空间,并且在引擎盖下有从旧存储复制到新底层存储的副本

此外,C++03标准中没有任何规定实现实际上必须调用allocator.construct,事实上许多(例如gcc)都没有这样做

C++0x标准为可移动类型的容器接口添加了新的成员函数,并澄清了operator=等对象在它们存在时的行为


请参见www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2486.pdf

如果您的编译器没有提供移动感知
std::vector
,那么您必须编写自己的
std::vector
专门化,而不仅仅是提供自定义分配器。整个C++03
vector
接口依赖于复制:
push_-back()
复制中的元素
resize()
使用作为第二个参数传递的元素的副本来初始化空元素(即使这是
T()
的默认值)
resize()
reserve()
insert()
erase()
push_back()
复制元素,如果向量需要重新分配,或者元素需要四处移动,等等

这是一个非常常见的问题,我在
std::thread
的(商业)实现中包含了这样一个专门化

a.push_back(T());