设为首页 加入收藏

TOP

C小程序 - 分析一个多线程的小程序(三)
2012-11-03 14:23:28 来源: 作者: 【 】 浏览:1908
Tags:程序   分析 一个 线程


  
  mailbox = args;            /* put ptr to our args there */
  
  printf(“COUNT%s: raising flag\n”, args->name);
  
  pthread_cond_signal(&flag);                //通知主线程信号变化
  
  printf(“COUNT%s: unlocking box\n”, args->name);
  
  pthread_mutex_unlock(&lock);                //释放锁。
  
  printf(“COUNT%s: unlocked box\n”, args->name);
  
  return NULL;
  
  }
  
  输出:
  
  [lizhuohua@lizhuohua-phy Program]$ ./program cp1.c cp2.c
  
  COUNT1: waiting to get lock
  
  COUNT2: waiting to get lock
  
  MAIN: waiting for flag to go up
  
  COUNT1: have lock, storing data
  
  COUNT1: raising flag
  
  COUNT1: unlocking box
  
  COUNT1: unlocked box
  
  MAIN: flag was raised, I have the lock
  
  131: cp1.c
  
  MAIN: waiting for flag to go up
  
  COUNT2: have lock, storing data
  
  COUNT2: raising flag
  
  COUNT2: unlocking box
  
  COUNT2: unlocked box
  
  MAIN: flag was raised, I have the lock
  
  131: cp2.c
  
  262: total words
  
  总结一下这个程序可能的执行过程:
  
  1. 第一种
  
  a 主线程create两个子线程后,进入到pthread_cond_wait阻塞,释放锁,等待信号
  
  b 第一个子线程,对文件中的word计数,对互斥量加锁,
  
  c 第二个子线程,对文件中的word计数,在pthead_mutex_lock处阻塞
  
  d 第一个子线程,给mailbox赋值,通知信号变化,释放锁,退出, 主线程获得信号通知
  
  e 第二个子线程,抢先主线程对互斥量加锁,判断mailbox不为NULL,释放锁,并等待信号
  
  f 主线程对互斥量加锁,从pthread_cond_wait返回,清空mailbox,通知信号变化,并在再次循环中pthread_cond_wait释放锁,等待信号
  
  g 第二个子线程,获得信号通知,加锁,继续执行,通知信号, 释放锁
  
  h 主线程获得信号,加锁,继续执行,然后执行pthread_cond_signal时候已经没有线程等待。
  
  2. 第二种
  
  a 主线程create两个子线程后,进入到pthread_cond_wait阻塞,释放锁,等待信号
  
  b 第一个子线程,对文件中的word计数,对互斥量加锁,
  
  c 第二个子线程,对文件中的word计数,在pthead_mutex_lock处阻塞
  
  d 第一个子线程,给mailbox赋值,通知信号变化,释放锁,退出, 主线程获得信号通知
  
  e 主线程对互斥量加锁,从pthread_cond_wait返回,清空mailbox,通知信号变化,并在再次循环中pthread_cond_wait释放锁,等待信号
  
  f 第二个子线程,对互斥量加锁,给mailbox赋值,通知信号变化,释放锁,退出, 主线程获得信号通知
  
  g 主线程获得信号,加锁,继续执行,然后执行pthread_cond_signal时候已经没有线程等待。
  
  问题:
  
  分析到最后,我发现这个主线程最后退出的时候,都没有把最后一次pthread_cond_wait中加锁的互斥量解锁。
  
  这样不解锁就退出,会有什么后果呢?

      

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言 内存管理详解 下一篇C小程序 - 信号量

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: