我目前正在学习 C++ 中的并发性,并遇到了使用线程 vector 的问题,我相信这在 C++0x 中是可能的。但是,我当前的编译器似乎没有 move 感知容器的实现,因此我会生成错误,因为 std::thread::thread(const std::thread&)
被删除,即我只能将 move 构造函数/move 赋值与 std::thread
一起使用。
我是否正确地认为我可以通过使用编写自定义分配器来规避这个问题
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
。不过,也请向我指出任何可能实现此功能的库,以便我可以查看源代码。
最佳答案
如果您的编译器不提供 move 感知 std::vector
那么你必须编写自己的 std::vector<std::thread>
特化而不仅仅是提供自定义分配器。整个C++03 vector
接口(interface)依赖于复制:push_back()
将元素复制到; resize()
使用作为第二个参数传递的元素的拷贝来初始化空元素(即使这是默认值 T()
); resize()
, reserve()
, insert()
, erase()
和push_back()
如果 vector 需要重新分配,或者元素需要 move ,等等,将复制元素。
这是一个非常常见的问题,因此我在我的(商业)just::thread 中包含了这样的特化。实现std::thread
。
关于c++ - 使用 move 作为线程 vector 的自定义分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3804884/