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

标签 c++ multithreading list thread-safety std

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

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

我很困惑如何传递列表。

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

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是你的线程的主体,在这个函数成员中你调用 push_backbkName列表,但未构建此对象 - 您遇到了段错误。

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

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

new BOOK list<string> bookName 的默认构造函数将被调用,然后你可以使用例如push_back在这个成员上。

关于C++ 标准线程和列表段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49253171/

相关文章:

org.apache.catalina.connector.Request.setAttribute 中的 java.lang.NullPointerException

python - 如何将元组列表转换为矩阵以进行列访问?

c# - List<T> 在类中使用

c++ - 如何以编程方式启动程序并在 Linux 上以 root 权限运行它?

c++ - 在来自 necessitas 的 qt 中显示当前窗口

c++ - 如何使用 boost::call_once 在 Linux 上用 C++ 设计单例类?

java - 多线程 Selenium WebDriver 与 Selenium Grid

c - 使用 OpenSSL C 库在多线程中生成椭圆曲线 key 对 (EC_KEY_generate_key)

python - 过滤列表。仅在项目之间有一定距离的情况下获取列表元素?

android - 如何使用 Qt 多媒体和 C++ 从 OpenGL 纹理中保存 .mp4 视频