2012-05-01 70 views
3

我想在C++中设置一个基本的线程类,但是当我尝试创建一个线程时出现Seg错误。下面是GDB报告:C++线程中的分段错误

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线程](http://www.boost.org/doc/libs/1_49_0/doc/html/thread.html)或[c + +11个主题](http://en.wikipedia.org/wiki/C%2B%2B11#Threading_facilities) – GWW

回答

7
​​

您写这封信是你还没有分配

+3

+1确实。在接近*线程之前,必须了解指针。 –

+0

@GregHewgill:至少在C++中。并发帕斯卡(例如)将是一个稍微不同的故事(即使正常的帕斯卡有指针,并发帕斯卡消除他们,至少如果我记得正确)。 –

+0

是的!我完全忽略了这一点。谢谢你的收获。 – Chris

3

记忆您在的ThreadState未初始化的指针。在第35行,你创建了一个指向ThreadState的指针,但你永远不会指定该指针指向任何ThreadState对象。请记住,指针只是一个内存地址。 “ThreadState *”只是意味着“这是一个内存地址,我们可以解释内存中的数据在我认为是一个ThreadState对象的地址。”也许你打算做“ThreadState * state = new ThreadState();”?别忘了,有人需要在完成使用时删除该ThreadState对象,以免泄漏内存!

+0

就是这样!我知道我忽略了一些东西,我一直在研究这个问题,所以我忽略了那个指针。 – Chris

+0

发生在我们身上:)这就是为什么有这样的原因,以帮助我们与我们太注意到的事情。 – int3h

+1

“你在ThreadState中有一个空指针” - 这个变量只是* uninitialised *而且通常可以是NULL或任何其他值。 –