当元素具有类成员 Boost Concurrent Queue 时无法调整向量的大小
Posted
技术标签:
【中文标题】当元素具有类成员 Boost Concurrent Queue 时无法调整向量的大小【英文标题】:Cannot resize a vector when element has class member Boost Concurrent Queue 【发布时间】:2021-09-20 18:34:58 【问题描述】:我正在创建 N 个对象,并且为每个对象生成一个线程来运行一个类方法。此类具有 Boost Concurrent Queue 作为成员。但是,我收到编译器 (GCC) 错误:
stl_uninitialized.h:137:72: error: static assertion failed: result type must be constructible from value type of input range
我在下面创建了一个较小的、独立的示例。错误指std::vector::resize()
:
#include <boost/thread/sync_bounded_queue.hpp>
#include <thread>
#include <vector>
struct Test
Test() :_queue(1)
// UPDATE Still get the problem after adding the below two lines
Test(const Test&) = delete;
Test(Test&&) = default;
void hello()
boost::concurrent::sync_bounded_queue<int> _queue;
;
int main()
std::vector<Test> vec;
vec.resize(10); // The error is caused by this line
for(size_t i = 0; i < 10; ++i)
std::thread t(&Test::hello, &vec.at(i));
t.join();
我使用向量的原因是因为如果我只是在堆栈上创建它们(如下所示)我不确定对象是否会超出循环范围
for(size_t i = 0; i < 10; ++i)
Test test;
std::thread t(&Test::hello, &test);
t.join();
【问题讨论】:
这有帮助吗:***.com/q/64758775/3684343 ? @mch 这是有道理的,但不幸的是,当我将这两个“构造函数”添加到测试时,我仍然得到编译器错误。boost::concurrent::sync_bounded_queue<int>
不是可复制或可移动的对象。
你可以使用std::vector<Test> vec(10);
而不是resize来初始化值
@dewaffled 10 只是一个例子。不幸的是,大小在编译时是未知的。
【参考方案1】:
将测试结构包裹在unique_ptr
中,它是完全可移动的。由于测试结构本身可能会变得非常复杂,而且可能也很大,而且由于您没有其他特别需要它可以移动,所以不值得这么麻烦。
int main()
std::vector<std::unique_ptr<Test>> vec;
for(size_t i = 0; i < 10; ++i)
vec.emplace_back(std::make_unique<Test>());
std::thread t(&Test::hello, vec.back().get());
// or std::thread t([&]vec.back()->hello(););
t.join();
如果您的生命周期管理变得更加复杂,请考虑shared_ptr
。
【讨论】:
以上是关于当元素具有类成员 Boost Concurrent Queue 时无法调整向量的大小的主要内容,如果未能解决你的问题,请参考以下文章
Boost.interprocess Vector 作为类成员