免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13577 | 回复: 56
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-23 10:31 |只看该作者 |倒序浏览
本帖最后由 埋头苦编 于 2011-11-23 13:22 编辑

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define THRNR 6

static pthread_mutex_t mut[THRNR];

static int next(int n)
{
        if (n+1==THRNR) {
                return 0;
        }
        return n+1;
}

static void *thr_abcd(void *ptr)
{
        int c='a';

        c+=(int)ptr;
        while (1) {
                pthread_mutex_lock(mut+(int)ptr);
//sleep(1);       
write(1, &c, 1);
//sleep(1);
pthread_mutex_unlock(mut+next((int)ptr));
        }
}


int
main()
{
        int i;
        pthread_t tid[THRNR];

        for (i=0;i<THRNR;++i) {
                pthread_mutex_init(mut+i, NULL);
                pthread_create(tid+i, NULL, thr_abcd, (void*)i);
        }

        sleep(5);

        exit(0);
}
程序效果:abcd连续出来
红色sleep不会影响程序效果,但是黄色的会打乱输出顺序,为什么?

论坛徽章:
0
2 [报告]
发表于 2011-11-23 13:23 |只看该作者
自己顶了,我认为在没解锁前其他线程都是阻塞的,在write前后加sleep因该没区别,可在write后加sleep输出顺序就变了

论坛徽章:
0
3 [报告]
发表于 2011-11-23 13:40 |只看该作者
回复 2# 埋头苦编


    刚刚试了一下,如果去掉两个sleep,正常反复输出abcdef连续5秒,如果加上红色的sleep,只有第一次是正常abcdef 后面输出的顺序也是乱的;如果只加上黄色 的sleep,每次都是乱序。

论坛徽章:
0
4 [报告]
发表于 2011-11-23 14:00 |只看该作者
sleep会导致线程交出CPU控制权。

这个函数相当于明确告诉操作系统,在接下来的一段时间里,它什么都不干。

论坛徽章:
0
5 [报告]
发表于 2011-11-23 14:08 |只看该作者
回复 3# 1514_louluo
我多是了几次,加红色的有一直abcdef的,也有第二次后乱序,后加黄色的第一次也是顺序的,后面的肯定是乱序,我认为在锁里面睡应该不会影响调度的,因为没解锁时其他线程都是阻塞的,两种情况都应该一样。结果不知道该怎么理解

论坛徽章:
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
6 [报告]
发表于 2011-11-23 14:10 |只看该作者
1. 不清楚LZ使用的什么系统,我使用Ubuntu 10.10进行测试发现,两个sleep随便注释哪个,都是随机的输出
2. 两个sleep都注释掉,在经过一段随机输出后,才能得到连续输出,我将开头一段截取出来,红色开始为连续输出了。LZ可以自己思考下为什么!
dbccabcefadbecfabdcefdaebfcabcdefabcdefabcdefabcdefabcdefabcdefabcdef

论坛徽章:
0
7 [报告]
发表于 2011-11-23 14:20 |只看该作者
回复 6# asuka2001

我用的红帽子,我想文的是文什么会有乱许,尤其是你说都注释后还有乱许,更难理解了,这里锁已经限定线程顺序了,应该不存在调度机制导致乱序的阿

论坛徽章:
0
8 [报告]
发表于 2011-11-23 14:49 |只看该作者
回复 5# 埋头苦编


    兄弟,你认为的是for循环里面先用pthread_create创建的线程先执行,所以导致了你认为所有的流程都基于这个时序之上。其实用pthread_create创建的线程并不能保证哪个会先执行!

论坛徽章:
0
9 [报告]
发表于 2011-11-23 14:57 |只看该作者
回复 1# 埋头苦编
你这个例子,只要第一个输出的字符是'a',后面的字符不管以什么顺序输出,都是合理的。因为,程序的实现是:6个线程分别不断的输出 'a', 'b', 'c', 'd', 'e', 'f'。那么逻辑上,肯定是第一个线程先获得锁,输出了第一个'a',其它后面的线程的执行顺序是不确定的。

论坛徽章:
0
10 [报告]
发表于 2011-11-23 14:58 |只看该作者
回复 1# 埋头苦编
你这个例子,只要第一个输出的字符是'a',后面的字符不管以什么顺序输出,都是合理的。因为,程序的实现是:6个线程分别不断的输出 'a', 'b', 'c', 'd', 'e', 'f'。那么逻辑上,肯定是第一个线程先获得锁,输出了第一个'a',其它后面的线程的执行顺序是不确定的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP