线程中的分段错误C++

Segmentation fault in C++ thread

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

我正在尝试在C++中设置一个基本的线程类,但是当我尝试创建线程时遇到seg错误。以下是GDB报告的内容:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401b68 in StartThread (pFunction=
    0x401ad2 <FindPrimesThread(void*)>, pLimit=5000000) at Thread.cpp:35
35          state->mLimit = pLimit;

当我尝试这样称呼它时:

ThreadState *primesState = StartThread(FindPrimesThread, 5000000);

这是我的代码:

线程.hpp

#ifndef THREAD_HPP
#define THREAD_HPP
#include <pthread.h>
#include "Types.hpp"
typedef struct {
    ulong       mLimit;     // Upper limit of numbers to test 
    int         mStarted;   // True if the thread started successfully
    int         mExitCode;  // Thread exit code
    pthread_t   mThreadId;  // Thread ID
} ThreadState;
// Defines a type named ThreadFunction which is a pointer to a function with void * as the parameter and
// void * as the return value.
typedef void *(*ThreadFunction)(void *);
ThreadState *StartThread
    (
    ThreadFunction const pFunction,  // Pointer to the thread function
    ulong const          pLimit      // Upper limit of numbers to test
    );
#endif

螺纹.cpp

#include "Amicable.hpp"
#include "Keith.hpp"
#include "Main.hpp"
#include "Prime.hpp"
#include "Thread.hpp"
ThreadState *StartThread
    (
    ThreadFunction const pFunction,  // Pointer to the thread function
    ulong const          pLimit      // Upper limit of numbers to test
    ) {
        ThreadState *state;
        state->mLimit = pLimit;
        pthread_t threadId;
        state->mStarted = pthread_create(&threadId, NULL, pFunction, (void *)state);
        if(state->mStarted == 0){
            state->mThreadId = threadId;
        }
        return state;
    }

知道这里出了什么问题吗?

ThreadState *state;
state->mLimit = pLimit;

您正在写入尚未分配的内存

你在 ThreadState 中有一个未初始化的指针。在第 35 行,创建指向 ThreadState 的指针,但从不将该指针指定为指向任何 ThreadState 对象。

请记住,指针只是一个内存地址。"ThreadState*"只是意味着,"这是一个内存地址,我们可以将内存中的数据解释为我持有的地址为ThreadState对象。

也许你的意思是做"ThreadState *state = new ThreadState();"?不要忘记,有人在使用完该 ThreadState 对象后需要去删除它,以免泄漏内存!