簡體   English   中英

錯誤:類型為“ void *(Thread ::)(void *)”的參數與“ void *(*)(void *)”不匹配

[英]error: argument of type ‘void* (Thread::)(void*)’ does not match ‘void* (*)(void*)’

我正在使用pthread為自己實現線程類。 因此,我如下創建Thread類:

class Thread
{
public:
  Thread()
  {
  }

  virtual void* run(void *params) = 0;

  void start(void *params)
  {
    pthread_create (&threadId, 0, run, params);
    pthread_join (threadId, 0);
  }

private:
  pthread_t threadId;
};

在實現了此類並覆蓋了virtual run功能之后,我將編譯該項目。 但是error: argument of type 'void* (Thread::)(void*)' does not match 'void* (*)(void*)' 我的代碼有什么問題?

提前致謝 :)

正是編譯器告訴您的內容。

pthread_create期望具有簽名的功能:

void* (*)(void*)

這是一個函數指針。

但是,您提供的東西帶有此簽名:

void* (Thread::)(void*)

不是函數指針,而是指向成員函數的指針。 區別在於:指向成員函數的指針需要一個對象的實例才能正常工作(在這里,它需要一個Thread實例)。

通常的解決方案是使您的函數static run :不再是成員函數-不再需要Thread實例即可正常工作,您可以將當前實例作為pthread_create的最后一個參數傳遞為了在線程啟動后對其采取行動。 您只需要將參數保存在類本身中。

public:
 void start(void *params)
 {
  this->my_thread_params = params;
  pthread_create (&threadId, 0, run, static_cast<void*>(this));
 }

private:
  static void *run(void *my_object)
  {
    // here, my_object already contains the params you passed to the function start
    static_cast<Thread*>(my_object)->my_member_function();
  }

該錯誤消息告訴您指向帶並返回void*void* (Thread::*)(void*) )的Thread中的成員函數的指針不能轉換為指向帶並返回相同void*函數的指針void*

盡管成員函數的聲明可能看起來與您所需的類型相似,但是在對Thread::run任何調用中都需要注入一個隱式Thread類型的this指針。

pthread_create是C函數,對C ++成員函數一無所知。 您需要給它一個靜態或非成員函數,並通過pthread_create的最后一個參數將指針傳遞給Thread對象; 就像是:

class Thread
{
    virtual void* run(void *params) = 0;

    void start(void * params)
    {
        this->params = params;
        pthread_create(&threadId, 0, &Thread::static_run, this);
    }

    static void * static_run(void * void_this)
    {
         Thread * thread_this = static_cast<Thread*>(void_this);
         return thread_this->run(thread_this->params);
    }

private:
    pthread_t threadId;
    void *params;
};

當然,在現代C ++中,這要簡單得多:

std::thread thread;

void start(void * params)
{
    thread = std::thread([this]{run(params);});
}

(盡管當然您不應該使用void*來傳遞參數,並且首先沒有充分的理由將線程包裝在類中。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM