当元素具有类成员 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&lt;int&gt; 不是可复制或可移动的对象。 你可以使用std::vector&lt;Test&gt; 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 shared_ptr 初始化为类成员

Boost.interprocess Vector 作为类成员

boost::mpi 作为模板类的静态成员

如何使用 boost::tokenizer 作为 C++ 类成员?

Boost python将命名参数传递给成员类

在 boost::asio 中使用具有可调整大小的 streambuf 的相同 istream