首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

线程池中的一个互斥锁有关问题

2013-11-15 
线程池中的一个互斥锁问题12: static void*13: thread_routine(void *arg)14: {15:tpool_work_t *work16:

线程池中的一个互斥锁问题

  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是局部变量,既不是static,也不是const,外面怎么能看见呢,然后你这样是想试用队列模型一边插入一边读取,这样有个坏处,对于锁的争用是很明显的,并发是上不去的,你可以试用多队列模型,或者是双缓冲多队列模型,将两个锁分开,只能帮到你这里了

热点排行