我正在用 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/