gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:26 25 4
gpt4 key购买 nike

我目前正在学习 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()使用作为第二个参数传递的元素的 copy 初始化空元素(即使这是 T() 的默认值); resize() , reserve() , insert() , erase()push_back()如果 vector 需要重新分配,或者元素需要四处 move ,将复制元素,等等。

这是一个如此普遍的问题,我在我的(商业)just::thread 中加入了这样的特化。实现std::thread .

关于c++ - 使用线程 vector move 的自定义分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3804884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com