在linux中调用pthread_create()导致'Segmentation fault'

时间:2012-10-18 08:12:46

标签: c linux

每当我调用方法'pthread_create'时,在编译代码后运行它,它总是会导致错误'Segmentation fault',我的代码如下所示,任何人都可以帮助我,非常感谢!

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

2 个答案:

答案 0 :(得分: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_logBufferStartIndex并且另一个线程正在修改它,则代码中可能还存在竞争条件,因为它可能会在if条件中的检查与其在popLogBuffer()

答案 1 :(得分:3)

logInformation函数有一个错误的原型:它应该是void *logInformation(void *info)

另外你应该按照以下方式传递它:

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

最后请注意pthread_create返回错误代码,即0表示一切正常。