thunk
- это шаблон функции.Как вы можете использовать typedef
на нем?Это не имеет смысла.Это не тип .Вы можете применять typedef
только к типам.
Вы должны сделать это:
ServerImpl *arg = new ServerImpl(); //why do I use new?
pthread_create(&thread_id, NULL, &thunk<ServerImpl,&ServerImpl::run>, arg);
Ваши аргументы pthread_create
неверны.Требуется 4 аргумента, а не 2.
Почему я использовал new?
Я создал экземпляр ServerImpl
, используя new
, потому что экземпляр должен существовать, даже если функция вкоторые вы создали тему вернули.Если я не создаю экземпляр, используя new
, и вместо этого использую локальную переменную, тогда код вызывает неопределенное поведение, если функция вернулась, но поток продолжает работать.
Ответ на ваши изменения:
Function fun = (Function)&thunk<ServerImpl,&ServerImpl::run>;
fun();
Это неправильно.Потому что thunk
принимает один аргумент.Поэтому вы должны сделать это вместо этого:
Function fun = (Function)&thunk<ServerImpl,&ServerImpl::run>;
fun(new ServerImpl); //pass an argument
Функция-член run
вызывается для этого аргумента, который вы передали.