假设我有一个像这样的文本文件
#####
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 字符串放入 - &gt; HERE&lt; - 使主要创建两个线程,指向两个不同的线程原型?
我想这样做是因为我想创建一个程序来创建不同类型的线程,具体取决于我想做什么,并从文本文件中选择(类似于配置文件)
任何建议?
答案 0 :(得分: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);
答案 1 :(得分:0)
更好的方法是创建一个默认的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);
}