使用类中的线程C++段错误
segfault using threads in C++ class
我正在用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;
}
相关文章:
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何摆脱C ++中的分段错误错误?
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 如何解决分段错误错误C++
- 作为参数模板的模板类:MSVC 错误 - 错误 C2977:模板参数过多 (C++98)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 卷曲给出分段错误错误
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 错误错误 C2872:"布尔值":kinect.h 的不明确符号
- C++打印模板容器错误(错误:"运算符<<"的不明确重载)理解?
- 结构的分割错误错误
- 为什么此代码返回分段错误错误?
- 错误错误:无法编译内置功能
- 分段错误错误C++
- C++ 1Z 错误:错误:演绎指南中声明中的显式限定
- 使用对数据类型的向量的哈希表中的分段错误错误
- 为什么此代码会导致分段错误错误
- JNA结构字段值错误
- C++段故障错误