/* There are two scenarios here. One is everything works as it should and second if * the thpool is to be killed. In that manner we try to BYPASS sem_wait and end each thread. */ void thpool_thread_do(thpool_t* tp_p){ while(thpool_keepalive){ if (sem_wait(tp_p->jobqueue->queueSem)) {/* WAITING until there is work in the queue */ perror("thpool_thread_do(): Waiting for semaphore"); exit(1); } if (thpool_keepalive){ /* Read job from queue and execute it */ void*(*func_buff)(void* arg); void* arg_buff; thpool_job_t* job_p; pthread_mutex_lock(&mutex); /* LOCK */ job_p = thpool_jobqueue_peek(tp_p); func_buff=job_p->function; arg_buff =job_p->arg; thpool_jobqueue_removelast(tp_p); pthread_mutex_unlock(&mutex); /* UNLOCK */ func_buff(arg_buff); /* run function */ free(job_p); /* DEALLOC job */ } else { return; /* EXIT thread*/ } } return; }
void thpool_thread_do(thpool_t* tp_p) { while(thpool_keepalive ==1) { if(sem_wait(tp_p->jobqueue->queueSem)) ///线程阻塞,等待通知 直到消息队列有数据 { perror("thpool_thread_do(): Waiting for semaphore"); exit(1); } if(thpool_keepalive) { //(void*)(*function)(void *arg); FUNC function; void* arg_buff; thpool_job_t* job_p; pthread_mutex_lock(&mutex); job_p = thpool_jobqueue_peek(tp_p); function = job_p->function; arg_buff = job_p->arg; if(thpool_jobqueue_removelast(tp_p)) return ; pthread_mutex_unlock(&mutex); function(arg_buff); //运行 你的方法。 free(job_p); ////释放掉。 } else { return ; } } return ; }
void thpool_thread_do (thpool_t *tp_p){ while (thpool_keepalive) { if (sem_wait (tp_p->jobqueue->queueSem)) //如果工作队列中没有工作,那么所有的线程都将在这里阻塞,当他调用成功的时候,信号量-1 { fprintf(stderr , "Waiting for semaphore\n"); exit (1); } if (thpool_keepalive) { void *(*func_buff) (void *arg); void *arg_buff; thpool_job_t *job_p; pthread_mutex_lock (&mutex); job_p = thpool_jobqueue_peek (tp_p); func_buff = job_p->function ; arg_buff= job_p->arg ; thpool_jobqueue_removelast (tp_p); pthread_mutex_unlock (&mutex); func_buff (arg_buff); free (job_p); } else { return ; } } return ; }