[英]argument of type 'void* (…)(void*)' does not match '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.