2013-07-22 4 views
3

Да, я знаю, как создать поток SDL.Как отправить дополнительные параметры в поток SDL?

int myfunc(void* data) 
{ 
    //my code... 
} 
SDL_CreateThread* mythread=SDL_CreateThread(myfunc,NULL); 

Но что, если я хочу сделать что-то вроде:

int myfunc(void* data,int myparameter1,char myparameter2) 
{ 
    //my code... 
} 
SDL_CreateThread* mythread=SDL_CreateThread(myfunc,NULL,42,'c'); 

т.е. как создать поток для функции с более чем одним параметров (параметров, за исключением обычного «пустоте * данных») Если это невозможно, вы можете предложить какой-либо метод, с помощью которого я могу передать параметр в поток?

ответ

6

Вы можете создать struct в куче, его поля с данными, а затем передать его адрес SDL_CreateThread:

typedef struct { 
    int param1; 
    char param2; 
} ThreadData; 

int myfunc(void* data) 
{ 
    ThreadData *tdata = data; 
    int param1 = tdata->param1; 
    char param2 = tdata->param2; 
    free(data); // depending on the content of `data`, this may have 
       // to be something more than a single `free` 
    //my code... 
} 
ThreadData *data = malloc(sizeof(ThreadData)); 
data->param1 = ...; 
data->param2 = ...; 
SDL_CreateThread* mythread=SDL_CreateThread(myfunc,data); 
+0

Мне кажется, что либо делать 'malloc' /' free' избыточна , или копирование данных в локальный стек потока. Правильно? – yzt

+0

Кроме того, я не уверен, что нужно подключать потоки SDL или нет (или это нормальная ситуация там), но если это так, вам нужно ограничить выделение кучи или копирование параметров в локальный стек. Это связано с тем, что если вы присоединитесь к дочернему потоку в основном потоке, то время жизни аргументов в стеке основного потока будет гарантировано охватывать время жизни дочернего потока. – yzt

+1

@yzt: распределение кучи состояло в том, чтобы гарантировать, что данные не будут перезаписаны в случае, если включенная функция, которая вызвала 'SDL_CreateThread'' return', перед тем, как поток просмотрел ее. Копирование переменных в локальный стек было не более чем показателем того, как использовать члены 'struct'; он может/должен быть изменен на нечто более разумное. –

Смежные вопросы