2012-02-06 7 views
1

typeofthread1、typeofthread2文字列を取得し、私はそのファイルを読みたい私のメインで作成するCスレッド

...のは、私はこの

##### 
typeofthread1 

##### 
typeofthread2 

などのような構成テキストファイルがあるとしましょうそして私はちょうどtypeofthread1typeofthread2を読んで置くことができる方法

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

を使用して別のスレッドを作成しますの文字列に - >ここで< - メインに2つの異なるスレッドプロトタイプを指す2つのスレッドを作成させますか?

私は、スレッドの異なる種類を作成するプログラムを作成したいので、私は何をしたいかに応じて、これをやりたい

、およびテキストファイル(設定ファイルの一種)

から任意の提案をすることをを選びます?

答えて

3

文字列名を関数ポインタにマップします。

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

pthreadsをすべて起動するデフォルトのthread_dispatch関数を作成するとよいでしょう。このディスパッチ関数は、スレッド固有のデータと実行するスレッド関数のタイプを指定した文字列を含む構造体に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); 
} 
関連する問題