C++线程中的分段错误

4
我正在尝试在C++中设置一个基本的线程类,但是当我尝试创建一个线程时,我得到了一个段错误。这是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);

以下是我的代码:

Thread.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

Thread.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;
    }

有没有想法,这里出了什么问题?

2
如果你使用boost threadsc++11 threads,你的生活会变得轻松得多 - GWW
2个回答

7
ThreadState *state;
state->mLimit = pLimit;

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

3
+1 的确如此。在接近线程之前,必须先理解指针。 - Greg Hewgill
@GregHewgill:至少在C++中是这样的。并发Pascal(举个例子)可能会有些不同(即使普通Pascal有指针,但并发Pascal消除了它们,如果我记得正确的话)。 - Jerry Coffin
是的!我完全忽略了那个。谢谢你指出来。 - Chris

3
您在ThreadState中有一个未初始化的指针。在第35行,您创建了一个ThreadState指针,但您从未将该指针分配为指向任何ThreadState对象。
请记住,指针只是一个内存地址。“ThreadState *”只意味着,“这是一个内存地址,我们可以将我所持有的内存地址中的数据解释为ThreadState对象。”
也许您想做“ThreadState *state = new ThreadState();”?不要忘记,当他们完成使用ThreadState对象时,某人需要去删除它,以防泄漏内存!

就是这样!我知道我忽略了什么,我已经在这个问题上工作了很长时间,结果忽略了那个指针。 - Chris
最好的人也会遇到这种情况 :) 这就是为什么有 SO,帮助我们处理那些因疲惫而忽略的事情。 - int3h
1
您在ThreadState中有一个空指针 - 变量只是未初始化,一般可以为NULL或任何其他值。 - Tony Delroy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接