создание потоков C из текстового файла - PullRequest
1 голос
/ 07 февраля 2012

Допустим, у меня есть текстовый файл, составленный следующим образом:

#####
typeofthread1

#####
typeofthread2

и т. Д. *

в моем основном я хочу прочитать этот файл, получить строки typeofthread1, typeofthread2 и создатьразличные потоки, используя

pthread_t threads[NUM_THREADS];
for (i=0;i<NUM_THREADS;i++)
    pthread_create(&threads[i], NULL, -> HERE <- , void * arg);

, как я могу поместить строки только что прочитанные typeofthread1 , typeofthread2 в -> HERE <- заставляя основной создать два потока, которые указывают надва разных прототипа потока? </p>

Я хочу сделать это, потому что я хочу создать программу, которая создает потоки разных типов, в зависимости от того, что я хочу сделать, и выбрать это из текстового файла (своего рода файла конфигурации)

есть предложения?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Сопоставить имена строк с указателями на функции.

void * thread_type_1 ( void * );
void * thread_type_2 ( void * );

typedef  void * (*start_routine_t)(void *);

typedef struct mapping_t {

     const char * name;
     start_routine_t function;

} mapping_t;

const mapping_t mappings[] = {
    {"thread-type-1", &thread_type_1},
    {"thread-type-2", &thread_type_2},
};
const size_t mapping_count =
    sizeof(mappings)/sizeof(mappings[0]);

Чтобы выбрать правильную функцию нити, выполните циклическое переключение элементов в mappings и возьмите функцию, когда имя совпадает.

start_routine_t get_start_routine ( const char * name )
{
    size_t i;
    for ( i=0; i < mapping_count; ++i )
    {
        if (strcmp(name,mappings[i].name) == 0) {
            return mappings[i].function;
        }
    }
    return NULL;
}

Везде, где вы запускаете поток, вы можете использовать это как:

start_routine_t start_routine;

/* find start routine matching token from file. */
start_routine = get_start_routine(name);
if (start_routine == NULL) {
    /* invalid type name, handle error. */
}

/* launch thread of the appropriate type. */
pthread_create(&threads[i], NULL, start_routine, (void*)arg);
0 голосов
/ 07 февраля 2012

Лучшим подходом было бы создание функции thread_dispatch по умолчанию, с которой вы запускаете все свои pthreads.Эта диспетчерская функция будет принимать структуру, содержащую void*, к структуре, содержащей данные, относящиеся к потоку, и строку, в которой указывается тип функции потока, которую вы хотите запустить.Затем вы можете, используя справочную таблицу, отображающую строку в тип указателя на функцию, созданный в модуле кода, найти соответствующий указатель на функцию и передать данные, специфичные для потока, в эту функцию.Так что это будет выглядеть примерно так:

typedef struct dispatch_data
{
    char function_type[MAX_FUNCTION_LENGTH];
    void* thread_specific_data;
} dispatch_data;

void* thread_dispatch(void* arg)
{
    dispatch_data* data = (dispatch_data*)arg;

    //... do look-up of function_pointer based on data->function_type string

    return function_pointer(data->thread_specific_data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...