0

メソッド「pthread_create」を呼び出すたびに、コードをコンパイルした後に実行すると、常に「セグメンテーション違反」というエラーが発生します。以下にリストされているコードは、誰でも助けてくれます。どうもありがとう!

int iLogThreadID;
pthread_t dwLogThread;
iLogThreadID = pthread_create(&dwLogThread, NULL, &logInformation, NULL);

メソッド「logInformation」は以下のようにリストされています

void* logInformation(void * info)
{
    char logInfoString[SINGLE_LOG_SIZE];
    memset(logInfoString,0,SINGLE_LOG_SIZE);
    if(gLogFile == NULL)
    {
        return EXEC_ERROR;
    }
    while(g_logThreadStatus == LOG_THREAD_RUNNING)
    {
        if(g_logBufferStartIndex == g_logBufferEndIndex)
        {
            sleep(10 );
            continue;
        }
        if(popLogBuffer(logInfoString) == EXEC_ERROR)
            continue;
        fputs(logInfoString, gLogFile);
        memset(logInfoString,0,SINGLE_LOG_SIZE);
    }
    g_logThreadStatus = LOG_THREAD_TERMINATED;
    return EXEC_OK;
}

メイクファイル

CXX= /usr/bin/gcc
LIBDIR=../coapLib
CFLAGS= -I${LIBDIR}
CXXFLAGS= ${CFLAGS} -g
LIBS= -lm -pthread -nostartfiles
OBJ = coapClient.o Block.o CoapMsg.o CoapObserve.o CoapOpt.o Common.o Config.o    IfMatch.o IO.o link.o md5.o cHashtable.o cJSON.o Log.o MsgHandle.o Network.o URIdatabase.o    messagePrint.o ConMsgBase.o ClientMsgHandle.o ClientInterpreter.o 
coapClient: ${OBJ}
    ${CXX} $(CXXFLAGS) -o coapClient ${OBJ} ${LIBS}
coapClient.o: coapClient.c
        ${CXX} ${CXXFLAGS} -c coapClient.c
...
clean:
rm -f *.o coapClient
4

2 に答える 2

3

考えられる原因 (特にsizeof(void*)sizeof(int)がシステムで異なる場合) は、スレッド開始ルーチンの署名が正しくないことです。void*ではなく、を返す必要がありintます。

man pthread_createから:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

条件でのチェックと での使用との間で変更される可能性があるため、popLogBuffer()を使用していて、別のスレッドがそれを変更している場合、コードに競合状態が発生する可能性もあります。g_logBufferStartIndexifpopLogBuffer()

于 2012-10-18T08:18:12.687 に答える
3

関数のlogInformationプロトタイプが間違っています: である必要がありますvoid *logInformation(void *info)

また、次のように渡す必要があります。

int ecode = pthread_create(&dwLogThread, NULL, logInformation, NULL);

最後に、エラー コードが返されることに注意してくださいpthread_create。これは 0 で、すべて問題ありません。

于 2012-10-18T08:20:26.340 に答える