2012-05-01 106 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或任何其他值。 –