免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 埋头苦编
打印 上一主题 下一主题

请高手解释下程序运行过程:多线程加锁阻塞问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-11-23 15:33 |只看该作者
回复 20# 1514_louluo


    论坛怎么回事。。。

论坛徽章:
1
白羊座
日期:2013-09-18 22:02:26
22 [报告]
发表于 2011-11-23 15:38 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>

  4. #define THRNR 6

  5. static pthread_mutex_t mut[THRNR];

  6. static int next(int n)
  7. {
  8.         if (n+1==THRNR) {
  9.                 return 0;
  10.         }
  11.         return n+1;
  12. }

  13. static void *thr_abcd(void *ptr)
  14. {
  15.         int c='a';

  16.         c+=(int)ptr;
  17.         while (1) {
  18.                 pthread_mutex_lock(mut+(int)ptr);
  19. //sleep(1);      
  20. write(1, &c, 1);
  21. //sleep(1);
  22. pthread_mutex_unlock(mut+next((int)ptr));
  23.         }
  24. }


  25. int
  26. main()
  27. {
  28.         int i;
  29.         pthread_t tid[THRNR];

  30.         for (i=0;i<THRNR;++i) {
  31.                 pthread_mutex_init(mut+i, NULL);
  32.                 if(i > 0) {
  33.                         pthread_mutex_lock(mut+i);
  34.                 }
  35.                 pthread_create(tid+i, NULL, thr_abcd, (void*)i);
  36.         }

  37.         sleep(5);

  38.         exit(0);
  39. }
复制代码
试试。

论坛徽章:
0
23 [报告]
发表于 2011-11-23 15:43 |只看该作者
回复  digdeep126
第一个输出后,解锁时限定的线程顺序不管用???
埋头苦编 发表于 2011-11-23 15:17

第一个输出a之后,解锁,然后,这时可能会有6个线程来竞争这个锁,但是哪一个线程获得锁,是不确定的。

论坛徽章:
0
24 [报告]
发表于 2011-11-23 15:53 |只看该作者
22楼正解,关键是他没有为bcdef初始化锁,所以abcdef刚开始的时候,对应的解锁完全没有作用~!

论坛徽章:
0
25 [报告]
发表于 2011-11-23 15:54 |只看该作者
回复 20# 1514_louluo
您能解释的在详细点马,我这里解锁的顺序一定,也就是线程上锁的顺序一定,而变量只有一个,被上一次锁加1,循环执行,第一次不一定是a,但是应该有序阿!

论坛徽章:
0
26 [报告]
发表于 2011-11-23 16:00 |只看该作者
回复 25# 埋头苦编

你在初始化的时候,需要如下:

36         pthread_t tid[THRNR];
37
38         for (i=0;i<THRNR;++i) {
39                 pthread_mutex_init(mut+i, NULL);
40                if(i != 0)
41                     pthread_mutex_lock(mut+i);
42                 pthread_create(tid+i, NULL, thr_abcd, (void*)i);
43         }
44
因为你没有为输出bcdef的那几个线程加锁,所以对应你刚开始a释放的b的那个锁,没有用~~!所以就会出现我说那种情况!

论坛徽章:
0
27 [报告]
发表于 2011-11-23 16:02 |只看该作者
没有看到pthread_mutex_unlock(mut+next((int)ptr)); 中带有next(ptr) 函数。22楼很强悍。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
28 [报告]
发表于 2011-11-23 16:10 |只看该作者
本帖最后由 asuka2001 于 2011-11-23 16:16 编辑

假设在LZ的系统上线程先创建,必定先执行,简单起见,只模拟3个线程A, B, C,以";"作为系统调度表示。

如果有黄色的sleep:

1. lock A, 输出 A, sleep; lock B, 输出 B, sleep; lock C, 输出C, sleep;
输出为ABC

2. unlock B, lock A阻塞; unlock C, lock B, 输出B, sleep; unlock A, lock C, 输出C, sleep;

3. lock A, 输出A, sleep;
输出为BCA

下次的话B先, 但是A还没给它解锁, 所以输出为CAB....

仅为大脑模拟运行, LZ自行验证下对不对吧...

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
29 [报告]
发表于 2011-11-23 16:13 |只看该作者
顺带抱怨一句, LZ的锁使用的有些欠妥; 请拿锁来保护公共数据, 而不是代码.....

论坛徽章:
0
30 [报告]
发表于 2011-11-23 16:29 |只看该作者
回复 24# 1514_louluo
这里6把锁在创建时就初始化了阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP