日期:2014-05-16  浏览次数:20675 次

简单线程池中的互斥锁问题
 /* 工作者线程函数, 从任务链表中取出任务并执行 */
  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: }


在网上看到一段线程池代码,关于互斥锁这儿没搞懂
互斥锁?c

------解决方案--------------------
work是局部变量,work赋值的过程中,任务链表被互斥锁锁住了,其他线程不会修改任务链表,work赋值完成之后,才解锁任务链表,之后不管任务链表怎么变,work的值都不会变了
------解决方案--------------------
不会阿!work的虽然是自己分配的内存空间出来!但是没有得到它的地址,也没有办法访问阿!
所以不需要担心。。