/* 工作者线程函数, 从任务链表中取出任务并执行 */ 12: static void* 13: thread_routine(void *arg) 14: { 15: tpool_work_t *work; 16: 17: while(1) { 18: /* 如果线程池没有被销毁且没有任务要执行,则等待 */ 19: pthread_mutex_lock(&tpool->queue_lock); 20: while(!tpool->queue_head && !tpool->shutdown) { 21: pthread_cond_wait(&tpool->queue_ready, &tpool->queue_lock); 22: } 23: if (tpool->shutdown) { 24: pthread_mutex_unlock(&tpool->queue_lock); 25: pthread_exit(NULL); 26: } 27: work = tpool->queue_head; 28: tpool->queue_head = tpool->queue_head->next; 29: pthread_mutex_unlock(&tpool->queue_lock); 30: //这里如果其他线程先获得锁,然后运行之后改变了work的值,而后下面这行代码再运行,会调用新的值么? 31: work->routine(work->arg); 32: free(work); 33: } 34: 35: return NULL; 36: }
在网上看到一段线程池代码,关于互斥锁这儿没搞懂
work是局部变量,work赋值的过程中,任务链表被互斥锁锁住了,其他线程不会修改任务链表,work赋值完成之后,才解锁任务链表,之后不管任务链表怎么变,work的值都不会变了 不会阿!work的虽然是自己分配的内存空间出来!但是没有得到它的地址,也没有办法访问阿! 所以不需要担心。。 互斥锁+条件变量,代码实现很标准。
|