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

segfault using threads in C++ class

本文关键字:段错误 错误 C++ 线程      更新时间:2023-10-16

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

这不是我的程序,但不要把这么多行代码放在一个例子中总结我做错的部分,你能告诉我我做错了什么吗?为什么我会有赛格故障?

#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++ 引用。似乎您需要将柱线实例作为 std::ref(bar) 传递。

我认为解决方案应该如下:

  void thread (void){
    sharedMessage_=new SharedMessage;
    bar instance;
    std::thread t(&bar::foo, std::ref(instance));
    t.join();
    std::cout << sharedMessage_->number << std::endl;
  }