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

时间:2014-12-13 18:11:45

标签: c++ linux multithreading

我用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();  
}

2 个答案:

答案 0 :(得分:1)

情况是:

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

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

如果要使用其初始化指针传递当前对象,可以执行以下操作:

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

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

答案 1 :(得分:0)

从线程上阅读c ++参考。看起来你需要将bar实例作为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;
  }