C++ 标准线程和列表分段错误(核心转储)

C++ std thread and list Segmentation fault (core dumped)

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

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

我很困惑如何通过列表。

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

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);
    ...
}

但还是一样

itemE::add 是你的线程的主体,在这个函数成员中你在 bkName 列表上调用 push_back,但是这个对象没有被构造 - 你遇到了分段错误。

malloc 函数只分配内存。调用此行 malloc(sizeof(BOOK)) 仅分配了 sizeof(BOOK) 字节,但未调用 bookName 成员的构造函数。您应该使用 new 分配内存并构造您的 BOOK 对象。

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

in new BOOK 将调用 list<string> bookName 的默认构造函数,然后您可以在该成员上使用 for exmaple push_back

考虑改用 lambda

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

}