代码之家  ›  专栏  ›  技术社区  ›  EVA KAO

C++std线程和列表分段错误(内核转储)

  •  0
  • EVA KAO  · 技术社区  · 7 年前

    我是多线程新手,我将在线程中传递一个列表。

    我希望一个线程可以添加一个字符串,另一个线程可以删除一个字符串。

    我不知道如何通过这个名单。

    这是我的部分代码,它出现了分段错误(内核转储)

    struct BOOK {
        list<string> bookName;
    };
    
    class itemE {
        ...
    
        itemE():
            bookList((BOOK*)malloc(sizeof(BOOK)))
        {
            count = 0;
            m_addThread = thread(&itemE::add, this, ref(bookList->bookName));           
            ...
        }   
    
        void add(list<string>& bkName)
        {
            ...
                m_mutex.lock();
                bkName.push_back(name);
                m_mutex.unlock();
            ...
        }
    
    };
    

    我试着修改了

    m_addThread = thread(&itemE::add, this, bookList);
    

    具有

    void add(BOOK* bk)
    {
        ...
            bk->bookName.push_back(name);
        ...
    }
    

    但还是一样

    2 回复  |  直到 7 年前
        1
  •  1
  •   rafix07    7 年前

    itemE::add 是线程的主体,在此函数成员中调用 push_back 在…上 bkName 列表,但此对象未构造-并且您遇到了分段错误。

    malloc 函数仅分配内存。拨打此电话 malloc(sizeof(BOOK)) 只有 sizeof(BOOK) 已分配字节,但构造函数 bookName 未调用成员。您应该使用 new 分配内存并构造BOOK对象。

    itemE():
        bookList(new BOOK)
    {
      ...
    

    在里面 new BOOK 的默认构造函数 list<string> bookName 将被调用,然后您可以使用exmaple 向后推 在此成员上。

        2
  •  0
  •   seccpur    7 年前

    考虑改用lambda

    itemE()
     :bookList(new BOOK)
    {
        count = 0;
        m_addThread = thread([this]() { add(bookList->bookName); });  
    
    }