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