c++ - 在 C++ 类中使用线程的段错误

标签 c++ linux multithreading

我正在用 C++ 编写程序以在 Linux 上进行内部聊天。代码有一个包含私有(private)结构的类属性,这个结构在共享内存中实例化所以 在多个终端上运行的同一个程序可以访问相同的数据并使聊天正常进行。我的问题是聊天必须同时读写, 所以你必须创建一个阅读线程和另一个阅读线程,但我不知道如何很好地使用它,当我进入线程时我遇到了问题,指针 可以说,共享内存结构被重置,指向地址 0x0 并给我段错误。

This is NOT my program, but not to put so many lines code I have summary in an example 我做错的部分,你能告诉我我做错了什么吗?为什么会出现段错误?

#include <thread>
#include <iostream>
#include <mutex>
#include <condition_variable>

class bar {
private:
  struct SharedMessage{ 
     int  number=21;
  };

  SharedMessage* sharedMessage_;

public:
  void foo(void) {
    std::cout << "hello from member function: " << std::endl;
    std::cout << sharedMessage_->number << std::endl;
  }
  void thread (void){
    sharedMessage_=new SharedMessage;
    std::thread t(&bar::foo, bar());
    t.join();
    std::cout << sharedMessage_->number << std::endl;
  }  
};

int main()
{
  bar Object;
  Object.thread();  
}

最佳答案

情况是:

std::thread t(&bar::foo, bar());

创建一个匿名 bar 对象并将拷贝传递给线程。它的 sharedMessage 指针未初始化,因此当您尝试访问 sharedMessage 编号时会出现段错误。

如果你想使用它的初始化指针传递当前对象,你可以这样做:

std::thread t(&bar::foo, this);

如果你想传递另一个对象,你也可以这样做,但你必须初始化 sharedMessage,例如通过给你的类一个默认构造函数。

关于c++ - 在 C++ 类中使用线程的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462078/

相关文章:

linux - 如何使用 Autoconf 检查 Linux 版本?

java - JEdi​​torPane 中 JScrollPane 长文本向下滚动

c++ - 使用 conio.h 更改文本颜色时出错

c++ - 分发 api 库时对 .so 版本和链接策略感到困惑

c++ - 如何将参数传递给工厂元素构造函数?

用于查看原始文件的 Linux 命令,包括其分隔符

c++ - 创建两个具有完全相同变量的对象

linux - 如何使用 grep 进行匹配但不打印匹配项?

multithreading - 多线程环境中的堆

multithreading - Netty ByteToMessageDecoder 不能@sharable