Как указано вашим компилятором pthread_create
ожидайте void* (*)(void*)
, но вы предоставляете функцию с очень похожим, но другим синтаксисом:
Каждая функция класса, отличного от static
, имеет скрытый параметр с именем this
типа class*
, поэтому теперь ваша функция void* (*)( class*, void* )
, что не соответствует ожидаемому pthread_create
. Вы должны предоставить функцию с такой же архитектурой.
Также, если в вашем классе есть такая функция, как void* someFunction()
, она может совпадать с функцией, которую ожидает pthread_create
, конечно, это не разрешено компилятором, и для этого также есть причина. Причина в соглашении о вызовах, то есть о том, как параметры, передаваемые в функцию, компилятор C ++ разрешил передавать this
в регистры! поэтому он не будет соответствовать функции, ожидаемой pthread_create
. Это может быть решено некоторыми компиляторами, которые позволяют вам выбрать соглашение о вызовах вашей функции, но это нестандартно, поэтому лучше всего написать прокси-функцию как:
static void* my_thread_routine_proxy(void* param) {
static_cast<my_class*>(param)->my_thread_routine();
}
Но если вам нужно передать больше параметров, вы должны создать для него структуру и передать свои параметры в этой структуре, но не помните, что переданная структура должна оставаться действительной до тех пор, пока ваша функция не будет фактически вызвана как новый поток. Значит, это должен быть глобальный или динамически выделяемый объект.
person
BigBoss
schedule
19.10.2012