免费注册 查看新帖 |

Chinaunix

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

关于pthread_mutex_lock排队的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-14 10:22 |只看该作者 |倒序浏览
void A()
{
while(1)
{
pthread_mutex_lock(&lock);
……;
pthread_mutex_unlock(&lock);
}
}

void B()
{
while(1)
{
pthread_mutex_lock(&lock);
……;
pthread_mutex_unlock(&lock);
}
}

如果是类似如上的代码,B线程根本没有抢到lock资源的机会,pthread的策略好像是按照线程的优先级顺序加锁,是否有办法按照排队的先后顺序进行加锁了(除了unlock后delay的方式)?象windows的EnterCriticalSection

[ 本帖最后由 还不错 于 2008-11-14 10:47 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
2 [报告]
发表于 2008-11-14 11:24 |只看该作者
你创建锁的时候,不创建优先级的试试?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2008-11-14 12:15 |只看该作者

回复 #1 还不错 的帖子

如果是类似如上的代码,B线程根本没有抢到lock资源的机会,pthread的策略好像是按照线程的优先级顺序加锁

从哪里得出这个结论?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
4 [报告]
发表于 2008-11-14 12:43 |只看该作者
线程的优先级是由内核调度的,不过你也可以改变线程的优先级,但需要root权限

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
5 [报告]
发表于 2008-11-14 13:13 |只看该作者
两个线程都是while(1),没有sleep,确实很可能会出现B线程“抢”不到执行权的情况。。。

因为你很难保证从A线程切换出去的时候,是在unlock之后。
如果是在lock和unlock之间从A线程切换到B线程,B还被lock着,结果又切换了回来。
而实际上,由于lock和unlock之间的是业务逻辑,执行时间必定会比外面的时间长,这样绝大部分的线程切换都发生在了这里。

论坛徽章:
0
6 [报告]
发表于 2008-11-14 15:27 |只看该作者
原帖由 yangsf5 于 2008-11-14 11:24 发表
你创建锁的时候,不创建优先级的试试?

我没有创建优先级

论坛徽章:
0
7 [报告]
发表于 2008-11-14 15:27 |只看该作者
原帖由 timespace 于 2008-11-14 12:15 发表

从哪里得出这个结论?


当然是我写程序测试了的

论坛徽章:
0
8 [报告]
发表于 2008-11-14 16:33 |只看该作者
pthread_setconcurrency(2) ?
或者测试数据太小了?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
9 [报告]
发表于 2008-11-14 16:45 |只看该作者
原帖由 还不错 于 2008-11-14 15:27 发表


当然是我写程序测试了的

可否贴下测试代码?

论坛徽章:
0
10 [报告]
发表于 2008-11-17 16:56 |只看该作者
原帖由 timespace 于 2008-11-14 16:45 发表

可否贴下测试代码?


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

#define HTCNT 2

pthread_mutex_t                        mutex;
int cnt=0;
int mpr[HTCNT];
pthread_t thread[HTCNT];

void *POO(void *v_pthread)
{
        int mr=*(int *)v_pthread;
        while(1)
        {
                pthread_mutex_lock(&mutex);
                if(cnt<200)
                {
                        printf("[%d][%d]\n",mr+1,++cnt);
                }
                else
                {
                        break;
                }
                pthread_mutex_unlock(&mutex);
                //usleep(10*1000);
        }
}

int main()
{
        int i;
        if(pthread_mutex_init(&mutex,NULL)!=0)
        {
                return 0;
        }
        for(i=0;i<HTCNT;i++)
        {
                mpr=i;
                if (pthread_create(&thread, NULL, POO, &mpr) != 0)
                {
                        return 0;
                }
        }
        getchar();
                return 1;
}


上述代码仅为了验证标题,未对线程回收等。
代码打印结果仅有第一个线程的数据,如果去掉usleep(10*1000);前的注释,可以发现是线程轮流抢到lock
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP