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

ここで何が問題になっているのかについて何か考えはありますか?

4

2 に答える 2

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

割り当てていないメモリに書き込んでいます

于 2012-05-01T04:22:00.083 に答える
3

ThreadState に初期化されていないポインターがあります。35 行目では、ThreadState へのポインターを作成しますが、そのポインターを ThreadState オブジェクトを指すように割り当てません。

ポインタは単なるメモリアドレスであることを忘れないでください。「ThreadState*」は、「これはメモリ アドレスであり、保持しているアドレスにあるメモリ内のデータを ThreadState オブジェクトとして解釈できる」という意味です。

おそらく、「ThreadState *state = new ThreadState();」を実行するつもりでしたか? 忘れないでください。誰かがその ThreadState オブジェクトを使い終わったら、メモリ リークを防ぐために行って削除する必要があります。

于 2012-05-01T04:24:35.437 に答える