我正在阅读线程池的通用C实现的源代码。
线程池数据结构定义为:
typedef struct _threadpool_st{
pthread_t *array;
pthread_mutex_t mutex;
pthread_cond_t job_posted;
pthread_cond_t job_taken;
int arrsz;
int live; //number of live threads in the pool
queueHead *theQueue; //queue of work orders
} _thread_pool;
然后有一个函数负责创建线程池
thread pool create_threadpool(int num_threads_in_pool) {
_threadpool *pool;
/* irrelevant initializations */
for(i = 0; i < pool->arrest; i++){
pthread_create(pool->array + i; NULL, do_work; (void *) pool);
pool->live = i + 1;
/* other stuff */
}
/* other stuff */
}
do_work函数如下:
void * do_work(void * owning_pool) {
_threadpool *pool = (_threadpool *)owning_pool;
int myid = pool->live;
/* some stuff */
}
我的理解是线程池中的每个线程都应该有自己的“myid” 但是,我认为竞争条件可能会随着实施方式而发生。创建池时,会创建一个执行do_work并传递指向池数据结构的指针的pthread。创建的所有线程都传递给参数数据结构的相同指针。每个线程都应该从该数据结构中读取live的值。但是,主线程(创建pthreads的线程)正在写入此实时变量。这里有什么我想念的吗?活动变量是否应该由池互斥锁保护?
完整的源代码在这里 http://people.clarkson.edu/~jmatthew/cs644.archive/cs644.fa2001/proj/pthreadsPool/