C++ std 线程并列出分段错误(核心转储)

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

本文关键字:错误 核心 转储 分段 std 线程 C++      更新时间:2023-10-16

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

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

我很困惑如何通过列表。

这是我代码的一部分,它得到了分段错误(核心转储)

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)
{
...

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

考虑改用lambda

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