1. 程式人生 > >pthread_create error: invalid use of non-static member function

pthread_create error: invalid use of non-static member function

問題描述:基於C++建立一個錄音的類,抓取mic的pcm資料,並返回。

class MicRecordImpl
{  
    void* audioThread(void *param);
    void startRecord(void);
};

其中,在實現類有一個執行緒函式:

void* MicRecordImpl::audioThread(void *param)
{
    //do recording
}

在startRecord()中,用需要pthread_create 一個執行緒來執行audioThread:

void MicRecordImpl::startRecord(void)
{
    int result = pthread_create(&mThread, &attr,audioThread, NULL);
}

編譯報錯:

MicRecorder.cpp: In member function 'int micrecord::MicRecorderImpl::audioThread(void*)':
MicRecorder.cpp:297:79: error: invalid use of non-static member function。

如果要建立執行緒函式audioThread為MicRecorderImpl類成員函式,就需要使用靜態函式。 但是,使用靜態函式有兩個問題:

1.靜態函式不能訪問非靜態成員; 2.無法實現多例項;

如何避開這個問題呢?就是再封裝一層,先呼叫靜態函式,在靜態函式中再呼叫原來的物件函式。 步驟如下:

1.audioThread改為靜態函式,封裝原來的audioThread內容為audioThreadImpl:

class MicRecordImpl
{  
    void* audioThread(void *param);
    void audioThreadImpl(void );
    void startRecord(void);
};
void* MicRecordImpl::audioThreadImpl()
{
        //do recording
}

2.建立執行緒時,傳入當前物件指標:

void MicRecordImpl::startRecord(void)
{
    int result = pthread_create(&mThread, &attr,audioThread, (void *)this);
}

3.audioThread在執行時把執行緒引數轉換為源物件指標,再執行audioThreadImpl:

void* MicRecordImpl::audioThread(void *param)
{
    MicRecordImpl* pThis = (AwMicRecordImpl*)param;
    pThis->audioThreadImpl();
}

4.重新編譯成功:

generate MicRecorder success!!!