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); });
}
我是多线程的新手,我打算在线程中传递一个列表。
我希望一个线程可以添加一个字符串,另一个线程可以删除一个字符串。
我很困惑如何通过列表。
这是我的部分代码,它出现了分段错误(核心已转储)
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); });
}