我正在用pthreads创建C
中的线程池,虽然我知道它是如何工作的,但我有一些关于复杂性的问题。
我已经创建了一个结构体,它应该是我的线程池的表示,包含要运行的函数指针列表,我们将其称为work_list。线程池结构体还保存互斥锁(?)和同步访问的条件,一个表示线程数的int和一个保存每个工作线程的线程id的数组。work_list本身保存了表示要完成的函数的结构体,这些结构体的每个实例都保存了函数的void*, args的void*和放置结果的void*。在编写代码时,这个想法是这样充实的:
typedef struct threadpool
{
list work_list;
pthread_t* tidArray;
int num_threads;
pthread_mutex_t lock;
pthread_cond_t condition;
} threadpool;
:
typedef struct fuFunction
{
void* functionCall;
void* functionArgs;
void* returnValue;
list_elem elem;
} fuFunction;
我目前有一个线程初始化a池。它接受int类型num_of_threads,并返回一个指向线程池实例的指针,所有线程池成员都已初始化。我创建的主体看起来像这样:
threadpool * threadpool_init(int num_of_threads)
{
threadpool* retPool = (threadpool*) malloc(sizeof(threadpool));
//Initialize retPool members
int x;
for(x = 0; x < num_of_threads; x++)
{
pthread_t tid;
if( pthread_create(&tid, NULL, thread_start, retPool) != 0)
{
printf("Error creating worker threadnExtingn");
exit(1);
}
retPool->tidArray[x] = tid;
}
return retPool;
}
每个线程在启动时运行的函数,工作函数thread_star,到目前为止看起来是这样的:
void *thread_start(void* args)
{
threadpool* argue = (threadpool*) args;
pthread_mutex_lock(&(argue->lock));
while(* threadpool not shut down*)
{
if(!list_empty(&argue->work_list))
{
fuFunction* tempFu = list_entry(list_pop_front(&argue->workQ), fuFunction, elem);
\WHAT TO PUT HERE
}
pthread_cond_wait(&argue->condition, &argue->lock);
}
pthread_mutex_unlock(&(argue->lock));
}
我的问题是,假设我目前拥有的代码是正确的,我如何让工作线程在它在工作函数中制作的tempFu中运行函数?抱歉,如果这很长或令人困惑,我发现这更容易在对话中解释。如果这是FUBAR,也让我知道。
结构元素签名"void* functionCall;"是错误的。使用函数指针代替。如:
typedef struct fuFunction
{
void* (*functionCall)( void* arg);
void* functionArgs;
void* returnValue;
list_elem elem;
} fuFunction;
然后放在那里:
tempfu->returnValue = (*tempfu->functionCall)(tempfu->functionArgs);