c++ - 使用 move 作为线程 vector 的自定义分配器

标签 c++ multithreading c++11 move-semantics move-constructor

我目前正在学习 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/

相关文章:

c++ - 如何将传递给 main(在 argv 中)的参数传递给我的函数?

c# - 向线程发送消息的最佳方式

c++ - 将 std::strings 的 std::vector 解析为任意类型的 std::tuple

c++ - 双重释放或损坏错误(找不到错误?)

c++ - boost 程序选项 : argument being detected more than once

c++ - 使用用户生成的文件名创建 ifstream?

c++ - Android NDK 应用构建但不运行

c++ - 在线程之间传输函数调用

c++ - WaitForSingleObject 崩溃

c++ - 将带有 Boost 的 C++ 应用程序从 Linux 移动到带有 Visual Studio 6 的 Windows